HwcComposer2D::HwcComposer2D() : mList(nullptr) , mMaxLayerCount(0) , mColorFill(false) , mRBSwapSupport(false) , mPrepared(false) , mHasHWVsync(false) , mLock("mozilla.HwcComposer2D.mLock") { mHal = HwcHALBase::CreateHwcHAL(); if (!mHal->HasHwc()) { LOGD("no hwc support"); return; } RegisterHwcEventCallback(); nsIntSize screenSize; GonkDisplay::NativeData data = GetGonkDisplay()->GetNativeData(GonkDisplay::DISPLAY_PRIMARY); ANativeWindow *win = data.mNativeWindow.get(); win->query(win, NATIVE_WINDOW_WIDTH, &screenSize.width); win->query(win, NATIVE_WINDOW_HEIGHT, &screenSize.height); mScreenRect = gfx::IntRect(gfx::IntPoint(0, 0), screenSize); mColorFill = mHal->Query(HwcHALBase::QueryType::COLOR_FILL); mRBSwapSupport = mHal->Query(HwcHALBase::QueryType::RB_SWAP); }
static jint nativeGetHeight(JNIEnv* env, jclass clazz, jlong nativeObject) { Surface* surface = reinterpret_cast<Surface*>(nativeObject); ANativeWindow* anw = static_cast<ANativeWindow*>(surface); int value = 0; anw->query(anw, NATIVE_WINDOW_HEIGHT, &value); return value; }
nsWindow::nsWindow() { mFramebuffer = nullptr; if (sScreenInitialized) return; sScreenOnEvent = new ScreenOnOffEvent(true); ClearOnShutdown(&sScreenOnEvent); sScreenOffEvent = new ScreenOnOffEvent(false); ClearOnShutdown(&sScreenOffEvent); GetGonkDisplay()->OnEnabled(displayEnabledCallback); nsIntSize screenSize; ANativeWindow *win = GetGonkDisplay()->GetNativeWindow(); if (win->query(win, NATIVE_WINDOW_WIDTH, &screenSize.width) || win->query(win, NATIVE_WINDOW_HEIGHT, &screenSize.height)) { NS_RUNTIMEABORT("Failed to get native window size, aborting..."); } gScreenBounds = nsIntRect(nsIntPoint(0, 0), screenSize); char propValue[PROPERTY_VALUE_MAX]; property_get("ro.sf.hwrotation", propValue, "0"); sPhysicalScreenRotation = atoi(propValue) / 90; sVirtualBounds = gScreenBounds; sScreenInitialized = true; nsAppShell::NotifyScreenInitialized(); // This is a hack to force initialization of the compositor // resources, if we're going to use omtc. // // NB: GetPlatform() will create the gfxPlatform, which wants // to know the color depth, which asks our native window. // This has to happen after other init has finished. gfxPlatform::GetPlatform(); if (!ShouldUseOffMainThreadCompositing()) { MOZ_CRASH("How can we render apps, then?"); } // Update sUsingHwc whenever layers.composer2d.enabled changes Preferences::AddBoolVarCache(&sUsingHwc, "layers.composer2d.enabled"); }
int HwcComposer2D::Init(hwc_display_t dpy, hwc_surface_t sur, gl::GLContext* aGLContext) { MOZ_ASSERT(!Initialized()); mHwc = (HwcDevice*)GetGonkDisplay()->GetHWCDevice(); if (!mHwc) { LOGE("Failed to initialize hwc"); return -1; } nsIntSize screenSize; ANativeWindow *win = GetGonkDisplay()->GetNativeWindow(); win->query(win, NATIVE_WINDOW_WIDTH, &screenSize.width); win->query(win, NATIVE_WINDOW_HEIGHT, &screenSize.height); mScreenRect = nsIntRect(nsIntPoint(0, 0), screenSize); #if ANDROID_VERSION >= 17 int supported = 0; if (mHwc->query) { if (mHwc->query(mHwc, HwcUtils::HWC_COLOR_FILL, &supported) == NO_ERROR) { mColorFill = !!supported; } if (mHwc->query(mHwc, HwcUtils::HWC_FORMAT_RB_SWAP, &supported) == NO_ERROR) { mRBSwapSupport = !!supported; } } else { mColorFill = false; mRBSwapSupport = false; } #else char propValue[PROPERTY_VALUE_MAX]; property_get("ro.display.colorfill", propValue, "0"); mColorFill = (atoi(propValue) == 1) ? true : false; mRBSwapSupport = true; #endif mDpy = dpy; mSur = sur; mGLContext = aGLContext; return 0; }
static jboolean nativeIsConsumerRunningBehind(JNIEnv* env, jclass clazz, jlong nativeObject) { sp<Surface> sur(reinterpret_cast<Surface *>(nativeObject)); if (!isSurfaceValid(sur)) { doThrowIAE(env); return JNI_FALSE; } int value = 0; ANativeWindow* anw = static_cast<ANativeWindow*>(sur.get()); anw->query(anw, NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND, &value); return value; }
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); }
int IOMXHWBuffer_GetMinUndequeued( void *window, unsigned int *min_undequeued ) { ANativeWindow *anw = (ANativeWindow *)window; status_t err; CHECK_ANW(); #if ANDROID_API >= 11 err = anw->query( anw, NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, min_undequeued ); CHECK_ERR(); #endif /* set a minimum value of min_undequeued in case query fails */ if( *min_undequeued == 0 ) *min_undequeued = 2; LOGD( "IOMXHWBuffer_GetMinUndequeued: %p %u", anw, *min_undequeued ); return 0; }
status_t CameraDeviceClient::createStream(const OutputConfiguration &outputConfiguration) { ATRACE_CALL(); status_t res; if ( (res = checkPid(__FUNCTION__) ) != OK) return res; Mutex::Autolock icl(mBinderSerializationLock); sp<IGraphicBufferProducer> bufferProducer = outputConfiguration.getGraphicBufferProducer(); if (bufferProducer == NULL) { ALOGE("%s: bufferProducer must not be null", __FUNCTION__); return BAD_VALUE; } if (!mDevice.get()) return DEAD_OBJECT; // Don't create multiple streams for the same target surface { ssize_t index = mStreamMap.indexOfKey(IInterface::asBinder(bufferProducer)); if (index != NAME_NOT_FOUND) { ALOGW("%s: Camera %d: Buffer producer already has a stream for it " "(ID %zd)", __FUNCTION__, mCameraId, index); return ALREADY_EXISTS; } } // HACK b/10949105 // Query consumer usage bits to set async operation mode for // GLConsumer using controlledByApp parameter. bool useAsync = false; int32_t consumerUsage; if ((res = bufferProducer->query(NATIVE_WINDOW_CONSUMER_USAGE_BITS, &consumerUsage)) != OK) { ALOGE("%s: Camera %d: Failed to query consumer usage", __FUNCTION__, mCameraId); return res; } if (consumerUsage & GraphicBuffer::USAGE_HW_TEXTURE) { ALOGW("%s: Camera %d: Forcing asynchronous mode for stream", __FUNCTION__, mCameraId); useAsync = true; } int32_t disallowedFlags = GraphicBuffer::USAGE_HW_VIDEO_ENCODER | GRALLOC_USAGE_RENDERSCRIPT; int32_t allowedFlags = GraphicBuffer::USAGE_SW_READ_MASK | GraphicBuffer::USAGE_HW_TEXTURE | GraphicBuffer::USAGE_HW_COMPOSER; bool flexibleConsumer = (consumerUsage & disallowedFlags) == 0 && (consumerUsage & allowedFlags) != 0; sp<IBinder> binder = IInterface::asBinder(bufferProducer); sp<Surface> surface = new Surface(bufferProducer, useAsync); ANativeWindow *anw = surface.get(); int width, height, format; android_dataspace dataSpace; if ((res = anw->query(anw, NATIVE_WINDOW_WIDTH, &width)) != OK) { ALOGE("%s: Camera %d: Failed to query Surface width", __FUNCTION__, mCameraId); return res; } if ((res = anw->query(anw, NATIVE_WINDOW_HEIGHT, &height)) != OK) { ALOGE("%s: Camera %d: Failed to query Surface height", __FUNCTION__, mCameraId); return res; } if ((res = anw->query(anw, NATIVE_WINDOW_FORMAT, &format)) != OK) { ALOGE("%s: Camera %d: Failed to query Surface format", __FUNCTION__, mCameraId); return res; } if ((res = anw->query(anw, NATIVE_WINDOW_DEFAULT_DATASPACE, reinterpret_cast<int*>(&dataSpace))) != OK) { ALOGE("%s: Camera %d: Failed to query Surface dataSpace", __FUNCTION__, mCameraId); return res; } // FIXME: remove this override since the default format should be // IMPLEMENTATION_DEFINED. b/9487482 if (format >= HAL_PIXEL_FORMAT_RGBA_8888 && format <= HAL_PIXEL_FORMAT_BGRA_8888) { ALOGW("%s: Camera %d: Overriding format %#x to IMPLEMENTATION_DEFINED", __FUNCTION__, mCameraId, format); format = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED; } // Round dimensions to the nearest dimensions available for this format if (flexibleConsumer && !CameraDeviceClient::roundBufferDimensionNearest(width, height, format, dataSpace, mDevice->info(), /*out*/&width, /*out*/&height)) { ALOGE("%s: No stream configurations with the format %#x defined, failed to create stream.", __FUNCTION__, format); return BAD_VALUE; } int streamId = -1; res = mDevice->createStream(surface, width, height, format, dataSpace, static_cast<camera3_stream_rotation_t> (outputConfiguration.getRotation()), &streamId); if (res == OK) { mStreamMap.add(binder, streamId); ALOGV("%s: Camera %d: Successfully created a new stream ID %d", __FUNCTION__, mCameraId, streamId); /** * Set the stream transform flags to automatically * rotate the camera stream for preview use cases. */ int32_t transform = 0; res = getRotationTransformLocked(&transform); if (res != OK) { // Error logged by getRotationTransformLocked. return res; } res = mDevice->setStreamTransform(streamId, transform); if (res != OK) { ALOGE("%s: Failed to set stream transform (stream id %d)", __FUNCTION__, streamId); return res; } return streamId; } return res; }