1 // Copyright (C) 2016 The Android Open Source Project
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 #include "RenderLibImpl.h"
15
16 #include "FrameBuffer.h"
17 #include "RendererImpl.h"
18
19 #include "base/Stream.h"
20 #include "host-common/address_space_device_control_ops.h"
21 #include "host-common/crash_reporter.h"
22 #include "host-common/dma_device.h"
23 #include "host-common/feature_control.h"
24 #include "host-common/logging.h"
25 #include "host-common/misc.h"
26 #include "host-common/sync_device.h"
27
28 #include "OpenGLESDispatch/EGLDispatch.h"
29 #include "OpenGLESDispatch/DispatchTables.h"
30
31 namespace emugl {
32
setRenderer(SelectedRenderer renderer)33 void RenderLibImpl::setRenderer(SelectedRenderer renderer) {
34 emugl::setRenderer(renderer);
35 }
36
setAvdInfo(bool phone,int api)37 void RenderLibImpl::setAvdInfo(bool phone, int api) {
38 emugl::setAvdInfo(phone, api);
39 }
40
getGlesVersion(int * maj,int * min)41 void RenderLibImpl::getGlesVersion(int* maj, int* min) {
42 emugl::getGlesVersion(maj, min);
43 }
44
setLogger(emugl_logger_struct logger)45 void RenderLibImpl::setLogger(emugl_logger_struct logger) {
46 // set_emugl_logger(logger.coarse);
47 // set_emugl_cxt_logger(logger.fine);
48 }
49
setGLObjectCounter(android::base::GLObjectCounter * counter)50 void RenderLibImpl::setGLObjectCounter(
51 android::base::GLObjectCounter* counter) {
52 emugl::setGLObjectCounter(counter);
53 }
54
setCrashReporter(emugl_crash_reporter_t reporter)55 void RenderLibImpl::setCrashReporter(emugl_crash_reporter_t reporter) {
56 // set_emugl_crash_reporter(reporter);
57 }
58
setFeatureController(emugl_feature_is_enabled_t featureController)59 void RenderLibImpl::setFeatureController(emugl_feature_is_enabled_t featureController) {
60 // set_emugl_feature_is_enabled(featureController);
61 }
62
setSyncDevice(emugl_sync_create_timeline_t create_timeline,emugl_sync_create_fence_t create_fence,emugl_sync_timeline_inc_t timeline_inc,emugl_sync_destroy_timeline_t destroy_timeline,emugl_sync_register_trigger_wait_t register_trigger_wait,emugl_sync_device_exists_t device_exists)63 void RenderLibImpl::setSyncDevice
64 (emugl_sync_create_timeline_t create_timeline,
65 emugl_sync_create_fence_t create_fence,
66 emugl_sync_timeline_inc_t timeline_inc,
67 emugl_sync_destroy_timeline_t destroy_timeline,
68 emugl_sync_register_trigger_wait_t register_trigger_wait,
69 emugl_sync_device_exists_t device_exists) {
70 set_emugl_sync_create_timeline(create_timeline);
71 set_emugl_sync_create_fence(create_fence);
72 set_emugl_sync_timeline_inc(timeline_inc);
73 set_emugl_sync_destroy_timeline(destroy_timeline);
74 set_emugl_sync_register_trigger_wait(register_trigger_wait);
75 set_emugl_sync_device_exists(device_exists);
76 }
77
setDmaOps(emugl_dma_ops ops)78 void RenderLibImpl::setDmaOps(emugl_dma_ops ops) {
79 set_emugl_dma_get_host_addr(ops.get_host_addr);
80 set_emugl_dma_unlock(ops.unlock);
81 }
82
setVmOps(const QAndroidVmOperations & vm_operations)83 void RenderLibImpl::setVmOps(const QAndroidVmOperations &vm_operations) {
84 set_emugl_vm_operations(vm_operations);
85 }
86
setAddressSpaceDeviceControlOps(struct address_space_device_control_ops * ops)87 void RenderLibImpl::setAddressSpaceDeviceControlOps(struct address_space_device_control_ops* ops) {
88 set_emugl_address_space_device_control_ops(ops);
89 }
90
setWindowOps(const QAndroidEmulatorWindowAgent & window_operations,const QAndroidMultiDisplayAgent & multi_display_operations)91 void RenderLibImpl::setWindowOps(const QAndroidEmulatorWindowAgent &window_operations,
92 const QAndroidMultiDisplayAgent &multi_display_operations) {
93 set_emugl_window_operations(window_operations);
94 set_emugl_multi_display_operations(multi_display_operations);
95 }
96
setUsageTracker(android::base::CpuUsage * cpuUsage,android::base::MemoryTracker * memUsage)97 void RenderLibImpl::setUsageTracker(android::base::CpuUsage* cpuUsage,
98 android::base::MemoryTracker* memUsage) {
99 emugl::setCpuUsage(cpuUsage);
100 emugl::setMemoryTracker(memUsage);
101 }
102
getGLESv2Dispatch(void)103 void* RenderLibImpl::getGLESv2Dispatch(void) {
104 return &s_gles2;
105 }
106
getEGLDispatch(void)107 void* RenderLibImpl::getEGLDispatch(void) {
108 return &s_egl;
109 }
110
getOpt(RenderOpt * opt)111 bool RenderLibImpl::getOpt(RenderOpt* opt) {
112 FrameBuffer* fb = FrameBuffer::getFB();
113 if (fb == nullptr) {
114 return false;
115 }
116
117 opt->display = fb->getDisplay();
118 opt->surface = fb->getWindowSurface();
119 opt->config = fb->getConfig();
120
121 return (opt->display && opt->surface && opt->config);
122 }
123
initRenderer(int width,int height,bool useSubWindow,bool egl2egl)124 RendererPtr RenderLibImpl::initRenderer(int width, int height,
125 bool useSubWindow, bool egl2egl) {
126 if (!mRenderer.expired()) {
127 return nullptr;
128 }
129
130 const auto res = std::make_shared<RendererImpl>();
131 if (!res->initialize(width, height, useSubWindow, egl2egl)) {
132 return nullptr;
133 }
134 mRenderer = res;
135 return res;
136 }
137
impl_onLastCbRef(uint32_t handle)138 static void impl_onLastCbRef(uint32_t handle) {
139 FrameBuffer* fb = FrameBuffer::getFB();
140 if (fb)
141 fb->onLastColorBufferRef(handle);
142 }
143
getOnLastColorBufferRef()144 OnLastColorBufferRef RenderLibImpl::getOnLastColorBufferRef() {
145 return (OnLastColorBufferRef)impl_onLastCbRef;
146 }
147
148 } // namespace emugl
149