}
Error Device::createVirtualDisplay(uint32_t width, uint32_t height,
- std::shared_ptr<Display>* outDisplay)
+ android_pixel_format_t* format, std::shared_ptr<Display>* outDisplay)
{
ALOGI("Creating virtual display");
hwc2_display_t displayId = 0;
+ int32_t intFormat = static_cast<int32_t>(*format);
int32_t intError = mCreateVirtualDisplay(mHwcDevice, width, height,
- &displayId);
+ &intFormat, &displayId);
auto error = static_cast<Error>(intError);
if (error != Error::None) {
return error;
}
ALOGI("Created virtual display");
+ *format = static_cast<android_pixel_format_t>(intFormat);
*outDisplay = getDisplayById(displayId);
(*outDisplay)->setVirtual();
return Error::None;
Error Display::setClientTarget(buffer_handle_t target,
const sp<Fence>& acquireFence, android_dataspace_t dataspace)
{
+ // TODO: Properly encode client target surface damage
int32_t fenceFd = acquireFence->dup();
int32_t intError = mDevice.mSetClientTarget(mDevice.mHwcDevice, mId, target,
- fenceFd, static_cast<int32_t>(dataspace));
+ fenceFd, static_cast<int32_t>(dataspace), {0, nullptr});
return static_cast<Error>(intError);
}
uint32_t getMaxVirtualDisplayCount() const;
Error createVirtualDisplay(uint32_t width, uint32_t height,
+ android_pixel_format_t* format,
std::shared_ptr<Display>* outDisplay);
void registerHotplugCallback(HotplugCallback hotplug);
return asFP<HWC2_PFN_SET_CLIENT_TARGET>(
displayHook<decltype(&Display::setClientTarget),
&Display::setClientTarget, buffer_handle_t, int32_t,
- int32_t>);
+ int32_t, hwc_region_t>);
case FunctionDescriptor::SetColorMode:
return asFP<HWC2_PFN_SET_COLOR_MODE>(
displayHook<decltype(&Display::setColorMode),
}
Error HWC2On1Adapter::Display::setClientTarget(buffer_handle_t target,
- int32_t acquireFence, int32_t /*dataspace*/)
+ int32_t acquireFence, int32_t /*dataspace*/, hwc_region_t /*damage*/)
{
std::unique_lock<std::recursive_mutex> lock(mStateMutex);
ALOGV("[%" PRIu64 "] setClientTarget(%p, %d)", mId, target, acquireFence);
mClientTarget.setBuffer(target);
mClientTarget.setFence(acquireFence);
- // dataspace can't be used by HWC1, so ignore it
+ // dataspace and damage can't be used by HWC1, so ignore them
return Error::None;
}
HWC2::Error createVirtualDisplay(uint32_t width, uint32_t height,
hwc2_display_t* outDisplay);
static int32_t createVirtualDisplayHook(hwc2_device_t* device,
- uint32_t width, uint32_t height, hwc2_display_t* outDisplay) {
+ uint32_t width, uint32_t height, int32_t* /*format*/,
+ hwc2_display_t* outDisplay) {
+ // HWC1 implementations cannot override the buffer format requested by
+ // the consumer
auto error = getAdapter(device)->createVirtualDisplay(width, height,
outDisplay);
return static_cast<int32_t>(error);
HWC2::Error present(int32_t* outRetireFence);
HWC2::Error setActiveConfig(hwc2_config_t configId);
HWC2::Error setClientTarget(buffer_handle_t target,
- int32_t acquireFence, int32_t dataspace);
+ int32_t acquireFence, int32_t dataspace,
+ hwc_region_t damage);
HWC2::Error setColorMode(int32_t mode);
HWC2::Error setColorTransform(android_color_transform_t hint);
HWC2::Error setOutputBuffer(buffer_handle_t buffer,
}
status_t HWComposer::allocateVirtualDisplay(uint32_t width, uint32_t height,
- int32_t *outId) {
+ android_pixel_format_t* format, int32_t *outId) {
if (mRemainingHwcVirtualDisplays == 0) {
ALOGE("allocateVirtualDisplay: No remaining virtual displays");
return NO_MEMORY;
}
std::shared_ptr<HWC2::Display> display;
- auto error = mHwcDevice->createVirtualDisplay(width, height, &display);
+ auto error = mHwcDevice->createVirtualDisplay(width, height, format,
+ &display);
if (error != HWC2::Error::None) {
ALOGE("allocateVirtualDisplay: Failed to create HWC virtual display");
return NO_MEMORY;
// Attempts to allocate a virtual display. If the virtual display is created
// on the HWC device, outId will contain its HWC ID.
status_t allocateVirtualDisplay(uint32_t width, uint32_t height,
- int32_t* outId);
+ android_pixel_format_t* format, int32_t* outId);
// Attempts to create a new layer on this display
std::shared_ptr<HWC2::Layer> createLayer(int32_t displayId);
NATIVE_WINDOW_HEIGHT, &height);
ALOGE_IF(status != NO_ERROR,
"Unable to query height (%d)", status);
+ int intFormat = 0;
+ status = state.surface->query(
+ NATIVE_WINDOW_FORMAT, &intFormat);
+ ALOGE_IF(status != NO_ERROR,
+ "Unable to query format (%d)", status);
+ auto format = static_cast<android_pixel_format_t>(
+ intFormat);
- mHwc->allocateVirtualDisplay(width, height,
+ mHwc->allocateVirtualDisplay(width, height, &format,
&hwcId);
+ // TODO: Plumb requested format back up to consumer
+
sp<VirtualDisplaySurface> vds =
new VirtualDisplaySurface(*mHwc,
hwcId, state.surface, bqProducer,