Merge "Revert "EGL/ANGLE/Vulkan: respect EGL resolved RGBX format"" into main
diff --git a/opengl/libs/EGL/egl_platform_entries.cpp b/opengl/libs/EGL/egl_platform_entries.cpp
index 6e4d513..a6af713 100644
--- a/opengl/libs/EGL/egl_platform_entries.cpp
+++ b/opengl/libs/EGL/egl_platform_entries.cpp
@@ -711,25 +711,24 @@
}
attrib_list = strippedAttribList.data();
- int err = native_window_set_buffers_format(window, static_cast<int>(format));
- if (err != 0) {
- ALOGE("error setting native window pixel format: %s (%d)", strerror(-err), err);
- if (!cnx->angleLoaded) {
+ if (!cnx->angleLoaded) {
+ int err = native_window_set_buffers_format(window, static_cast<int>(format));
+ if (err != 0) {
+ ALOGE("error setting native window pixel format: %s (%d)", strerror(-err), err);
native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
+ return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
}
- return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
- }
- android_dataspace dataSpace = dataSpaceFromEGLColorSpace(colorSpace, format);
- // Set dataSpace even if it could be HAL_DATASPACE_UNKNOWN. HAL_DATASPACE_UNKNOWN is the default
- // value, but it may have changed at this point.
- err = native_window_set_buffers_data_space(window, dataSpace);
- if (err != 0) {
- ALOGE("error setting native window pixel dataSpace: %s (%d)", strerror(-err), err);
- if (!cnx->angleLoaded) {
+ android_dataspace dataSpace = dataSpaceFromEGLColorSpace(colorSpace, format);
+ // Set dataSpace even if it could be HAL_DATASPACE_UNKNOWN.
+ // HAL_DATASPACE_UNKNOWN is the default value, but it may have changed
+ // at this point.
+ err = native_window_set_buffers_data_space(window, dataSpace);
+ if (err != 0) {
+ ALOGE("error setting native window pixel dataSpace: %s (%d)", strerror(-err), err);
native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
+ return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
}
- return setError(EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE);
}
// the EGL spec requires that a new EGLSurface default to swap interval
@@ -744,8 +743,8 @@
}
// EGLSurface creation failed
- native_window_set_buffers_format(window, 0);
if (!cnx->angleLoaded) {
+ native_window_set_buffers_format(window, 0);
native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
}
return EGL_NO_SURFACE;
diff --git a/vulkan/libvulkan/swapchain.cpp b/vulkan/libvulkan/swapchain.cpp
index 3eeb6b1..74d3d9d 100644
--- a/vulkan/libvulkan/swapchain.cpp
+++ b/vulkan/libvulkan/swapchain.cpp
@@ -250,7 +250,6 @@
android::sp<ANativeWindow> window;
VkSwapchainKHR swapchain_handle;
uint64_t consumer_usage;
- int default_format;
// Indicate whether this surface has been used by a swapchain, no matter the
// swapchain is still current or has been destroyed.
@@ -527,15 +526,12 @@
*count = num_copied;
}
-PixelFormat GetNativePixelFormat(VkFormat format,
- VkCompositeAlphaFlagBitsKHR alpha) {
+PixelFormat GetNativePixelFormat(VkFormat format) {
PixelFormat native_format = PixelFormat::RGBA_8888;
switch (format) {
case VK_FORMAT_R8G8B8A8_UNORM:
case VK_FORMAT_R8G8B8A8_SRGB:
- native_format = alpha == VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR
- ? PixelFormat::RGBX_8888
- : PixelFormat::RGBA_8888;
+ native_format = PixelFormat::RGBA_8888;
break;
case VK_FORMAT_R5G6B5_UNORM_PACK16:
native_format = PixelFormat::RGB_565;
@@ -625,12 +621,11 @@
return VK_ERROR_OUT_OF_HOST_MEMORY;
Surface* surface = new (mem) Surface;
- ANativeWindow* window = pCreateInfo->window;
- surface->window = window;
+ surface->window = pCreateInfo->window;
surface->swapchain_handle = VK_NULL_HANDLE;
surface->used_by_swapchain = false;
- int err =
- native_window_get_consumer_usage(window, &surface->consumer_usage);
+ int err = native_window_get_consumer_usage(surface->window.get(),
+ &surface->consumer_usage);
if (err != android::OK) {
ALOGE("native_window_get_consumer_usage() failed: %s (%d)",
strerror(-err), err);
@@ -639,16 +634,8 @@
return VK_ERROR_SURFACE_LOST_KHR;
}
- err = window->query(window, NATIVE_WINDOW_FORMAT, &surface->default_format);
- if (err != android::OK) {
- ALOGE("NATIVE_WINDOW_FORMAT query failed: %s (%d)", strerror(-err),
- err);
- surface->~Surface();
- allocator->pfnFree(allocator->pUserData, surface);
- return VK_ERROR_SURFACE_LOST_KHR;
- }
-
- err = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
+ err =
+ native_window_api_connect(surface->window.get(), NATIVE_WINDOW_API_EGL);
if (err != android::OK) {
ALOGE("native_window_api_connect() failed: %s (%d)", strerror(-err),
err);
@@ -914,7 +901,7 @@
VkSurfaceCapabilities2KHR* pSurfaceCapabilities) {
ATRACE_CALL();
- auto surface_handle = pSurfaceInfo->surface;
+ auto surface = pSurfaceInfo->surface;
auto capabilities = &pSurfaceCapabilities->surfaceCapabilities;
VkSurfacePresentModeEXT const *pPresentMode = nullptr;
@@ -935,9 +922,7 @@
int transform_hint;
int max_buffer_count;
int min_undequeued_buffers;
- VkCompositeAlphaFlagsKHR composite_alpha =
- VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;
- if (surface_handle == VK_NULL_HANDLE) {
+ if (surface == VK_NULL_HANDLE) {
const InstanceData& instance_data = GetData(physicalDevice);
ProcHook::Extension surfaceless = ProcHook::GOOGLE_surfaceless_query;
bool surfaceless_enabled =
@@ -958,8 +943,7 @@
capabilities->minImageCount = 0xFFFFFFFF;
capabilities->maxImageCount = 0xFFFFFFFF;
} else {
- Surface& surface = *SurfaceFromHandle(surface_handle);
- ANativeWindow* window = surface.window.get();
+ ANativeWindow* window = SurfaceFromHandle(surface)->window.get();
err = window->query(window, NATIVE_WINDOW_DEFAULT_WIDTH, &width);
if (err != android::OK) {
@@ -1034,17 +1018,6 @@
min_undequeued_buffers + default_additional_buffers);
capabilities->maxImageCount = static_cast<uint32_t>(max_buffer_count);
}
-
- // The surface default format can be either of below:
- // - consumer side default format
- // - platform EGL resolved format and we get here via ANGLE
- //
- // For any of above, advertise OPAQUE bit so that later swapchain
- // creation can resolve VK_FORMAT_R8G8B8A8_* to RGBX_8888 only if the
- // client also requests OPAQUE bit for compositeAlpha.
- if (surface.default_format == (int)PixelFormat::RGBX_8888) {
- composite_alpha |= VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
- }
}
capabilities->currentExtent =
@@ -1071,7 +1044,9 @@
capabilities->currentTransform =
TranslateNativeToVulkanTransform(transform_hint);
- capabilities->supportedCompositeAlpha = composite_alpha;
+ // On Android, window composition is a WindowManager property, not something
+ // associated with the bufferqueue. It can't be changed from here.
+ capabilities->supportedCompositeAlpha = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;
capabilities->supportedUsageFlags =
VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
@@ -1670,21 +1645,20 @@
ALOGV("vkCreateSwapchainKHR: surface=0x%" PRIx64
" minImageCount=%u imageFormat=%u imageColorSpace=%u"
- " imageExtent=%ux%u imageUsage=%#x preTransform=%u compositeAlpha=%u"
- " presentMode=%u oldSwapchain=0x%" PRIx64,
+ " imageExtent=%ux%u imageUsage=%#x preTransform=%u presentMode=%u"
+ " oldSwapchain=0x%" PRIx64,
reinterpret_cast<uint64_t>(create_info->surface),
create_info->minImageCount, create_info->imageFormat,
create_info->imageColorSpace, create_info->imageExtent.width,
create_info->imageExtent.height, create_info->imageUsage,
- create_info->preTransform, create_info->compositeAlpha,
- create_info->presentMode,
+ create_info->preTransform, create_info->presentMode,
reinterpret_cast<uint64_t>(create_info->oldSwapchain));
if (!allocator)
allocator = &GetData(device).allocator;
- PixelFormat native_pixel_format = GetNativePixelFormat(
- create_info->imageFormat, create_info->compositeAlpha);
+ PixelFormat native_pixel_format =
+ GetNativePixelFormat(create_info->imageFormat);
DataSpace native_dataspace = GetNativeDataspace(
create_info->imageColorSpace, create_info->imageFormat);
if (native_dataspace == DataSpace::UNKNOWN) {