void QEglFSPandaHooks::ensureFramebufferNativeWindowCreated() { if (mFramebufferNativeWindow.get()) return; mFramebufferNativeWindow = new FramebufferNativeWindow(); framebuffer_device_t const *fbDev = mFramebufferNativeWindow->getDevice(); if (!fbDev) qFatal("Failed to get valid FramebufferNativeWindow, no way to create EGL surfaces"); ANativeWindow *window = mFramebufferNativeWindow.get(); window->query(window, NATIVE_WINDOW_FORMAT, &mFramebufferVisualId); }
MemoryHeapPmem::MemoryHeapPmem(const sp<MemoryHeapBase>& pmemHeap, uint32_t flags) : MemoryHeapBase() { char const * const device = pmemHeap->getDevice(); #ifdef HAVE_ANDROID_OS if (device) { int fd = open(device, O_RDWR | (flags & NO_CACHING ? O_SYNC : 0)); ALOGE_IF(fd<0, "couldn't open %s (%s)", device, strerror(errno)); if (fd >= 0) { int err = ioctl(fd, PMEM_CONNECT, pmemHeap->heapID()); if (err < 0) { ALOGE("PMEM_CONNECT failed (%s), mFD=%d, sub-fd=%d", strerror(errno), fd, pmemHeap->heapID()); close(fd); } else { // everything went well... mParentHeap = pmemHeap; MemoryHeapBase::init(fd, pmemHeap->getBase(), pmemHeap->getSize(), pmemHeap->getFlags() | flags, device); } } } #else mParentHeap = pmemHeap; MemoryHeapBase::init( dup(pmemHeap->heapID()), pmemHeap->getBase(), pmemHeap->getSize(), pmemHeap->getFlags() | flags, device); #endif }
int main(int argc, char** argv) { LOGE("*** Noodleland ***"); gNativeWindow = new FramebufferNativeWindow(); const framebuffer_device_t* fbDev = gNativeWindow->getDevice(); if (!fbDev) { LOGE("Display subsystem failed to initialise. check logs. exiting..."); return 0; } const ANativeWindow* window = gNativeWindow.get(); int width = 0, height = 0, format = 0; window->query(window, NATIVE_WINDOW_WIDTH, &width); window->query(window, NATIVE_WINDOW_HEIGHT, &height); window->query(window, NATIVE_WINDOW_FORMAT, &format); LOGE("width = %d", width); LOGE("height = %d", height); LOGE("format = 0x%08X", format); LOGE("xdpi = %f", window->xdpi); LOGE("ydpi = %f", window->ydpi); EGLint numConfigs; EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); eglInitialize(display, NULL, NULL); eglGetConfigs(display, NULL, 0, &numConfigs); EGLint attribs[] = { EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE }; EGLConfig config = NULL; status_t err = selectConfigForPixelFormat(display, attribs, format, &config); LOGE_IF(err, "couldn't find an EGLConfig matching the screen format"); EGLint r,g,b,a; eglGetConfigAttrib(display, config, EGL_RED_SIZE, &r); eglGetConfigAttrib(display, config, EGL_GREEN_SIZE, &g); eglGetConfigAttrib(display, config, EGL_BLUE_SIZE, &b); eglGetConfigAttrib(display, config, EGL_ALPHA_SIZE, &a); LOGE("r = %d, g = %d, b = %d, a = %d", r, g, b, a); EGLSurface surface = eglCreateWindowSurface(display, config, gNativeWindow.get(), NULL); eglQuerySurface(display, surface, EGL_WIDTH, &gWidth); eglQuerySurface(display, surface, EGL_HEIGHT, &gHeight); if (gNativeWindow->isUpdateOnDemand()) { LOGE("*** PARTIAL UPDATES"); eglSurfaceAttrib(display, surface, EGL_SWAP_BEHAVIOR, EGL_BUFFER_DESTROYED); } EGLint contextAttribs[] = { EGL_NONE }; EGLContext context = eglCreateContext(display, config, NULL, contextAttribs); EGLBoolean result; result = eglMakeCurrent(display, surface, surface, context); if (!result) { LOGE("Couldn't create a working GLES context. check logs. exiting..."); return 0; } LOGE("EGL information"); LOGE("# of configs: %d", numConfigs); LOGE("vendor : %s", eglQueryString(display, EGL_VENDOR)); LOGE("version : %s", eglQueryString(display, EGL_VERSION)); LOGE("extensions : %s", eglQueryString(display, EGL_EXTENSIONS)); LOGE("client API : %s", eglQueryString(display, EGL_CLIENT_APIS) ?: "Not Supported"); LOGE("EGL surface : %d-%d-%d-%d, config=%p", r, g, b, a, config); LOGE("OpenGL information"); LOGE("vendor : %s", glGetString(GL_VENDOR)); LOGE("renderer : %s", glGetString(GL_RENDERER)); LOGE("version : %s", glGetString(GL_VERSION)); LOGE("extensions : %s", glGetString(GL_EXTENSIONS)); /* AMD Performance Counters */ GLint num_groups; char buffer[512]; glGetPerfMonitorGroupsAMD(&num_groups, 0, NULL); for (int group = 0; group < num_groups; group++) { glGetPerfMonitorGroupStringAMD(group, 512, NULL, buffer); LOGE("Perf Monitor Group [%d]: %s", group, buffer); GLint num_counters, max_active_counters; glGetPerfMonitorCountersAMD(group, &num_counters, &max_active_counters, 0, NULL); LOGE(" Counters #: %d, Max Active: %d", num_counters, max_active_counters); GLuint* counters = new GLuint[num_counters]; glGetPerfMonitorCountersAMD(group, NULL, NULL, num_counters, counters); for (int c = 0; c < num_counters; c++) { GLuint counter = counters[c]; glGetPerfMonitorCounterStringAMD(group, counter, 512, NULL, buffer); LOGE(" %s (%u/0x%08x)", buffer, counter, counter); } delete [] counters; } err = hw_get_module(HWC_HARDWARE_MODULE_ID, &gHwcModule); if (err) { LOGE(HWC_HARDWARE_MODULE_ID " module not found."); return 0; } err = hwc_open(gHwcModule, &gHwc); if (err) { LOGE(HWC_HARDWARE_COMPOSER " device failed to initialize (%s)", strerror(-err)); return 0; } if (gHwc->registerProcs) { gHwcProcs.invalidate = hwc_invalidate_cb; gHwc->registerProcs(gHwc, &gHwcProcs); } gHwcDisplay = (hwc_display_t) display; gHwcSurface = (hwc_surface_t) surface; err = hwc_create_work_list(NUMA(test_sprites)); if (err) return 0; create_sprites(); uint32_t flipCount = 0; for (;;) { hwc_layer_t& ll = gHwcList->hwLayers[0]; update_sprites(); HwcLayerCount layerCounts; err = hwc_prepare_list(&layerCounts); if (err) return 0; #ifdef NOODLE_DUMP_HWC_LIST LOGE("HWC state: %d", flipCount); LOGE("Num OV: %d", layerCounts.NumOVLayers); LOGE("Num FB: %d", layerCounts.NumFBLayers); LOGE(" numHwLayers=%u, flags=0x%08x", gHwcList->numHwLayers, gHwcList->flags); LOGE(" type | handle | hints | flags | tr | blend | format | source crop | frame name"); LOGE("----------+----------+----------+----------+----+-------+----------+---------------------------+--------------------------------"); uint32_t format = PIXEL_FORMAT_RGBA_8888; for (size_t n = 0; n < gHwcList->numHwLayers; n++) { const hwc_layer_t& l = gHwcList->hwLayers[n]; LOGE(" %8s | %08x | %08x | %08x | %02x | %05x | %08x | [%5d,%5d,%5d,%5d] | [%5d,%5d,%5d,%5d] %s", l.compositionType ? "OVERLAY" : "FB", intptr_t(l.handle), l.hints, l.flags, l.transform, l.blending, format, l.sourceCrop.left, l.sourceCrop.top, l.sourceCrop.right, l.sourceCrop.bottom, l.displayFrame.left, l.displayFrame.top, l.displayFrame.right, l.displayFrame.bottom, "buffer"); } if (gHwc->common.version >= 1 && gHwc->dump) { gHwc->dump(gHwc, tempbuffer, SIZE); LOGE("%s", tempbuffer); } #endif #ifdef NOODLE_DEBUG_CLEAR if (flipCount & 0x1) { glClearColor(1,0,0,0); } else { glClearColor(0,1,0,0); } #else glClearColor(0,0,0,0); #endif glClear(GL_COLOR_BUFFER_BIT); gNativeWindow->compositionComplete(); err = hwc_commit(); // Flip if (err) { LOGE("hwc commit failed: %s", strerror(-err)); return 0; } flipCount += 1; } return 0; }