diff options
| author | 2022-06-29 21:21:49 +0000 | |
|---|---|---|
| committer | 2022-06-29 21:21:49 +0000 | |
| commit | 618c76e5c04f99f2e295fcd2ffcb896476a68f38 (patch) | |
| tree | db84b827307260c3e1e05d5d30a08c08d427e158 /vulkan/libvulkan/swapchain.cpp | |
| parent | 31afdea9a497881604f2395b7a870d4ee21497c6 (diff) | |
| parent | 552bdbb3f7e423c4047ed209917a12f8cadf86e9 (diff) | |
Merge "Merge tm-dev-plus-aosp-without-vendor@8763363" into stage-aosp-master
Diffstat (limited to 'vulkan/libvulkan/swapchain.cpp')
| -rw-r--r-- | vulkan/libvulkan/swapchain.cpp | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/vulkan/libvulkan/swapchain.cpp b/vulkan/libvulkan/swapchain.cpp index e60625be89..48d6fd0bd5 100644 --- a/vulkan/libvulkan/swapchain.cpp +++ b/vulkan/libvulkan/swapchain.cpp @@ -23,6 +23,8 @@ #include <sync/sync.h> #include <system/window.h> #include <ui/BufferQueueDefs.h> +#include <ui/DebugUtils.h> +#include <ui/PixelFormat.h> #include <utils/StrongPointer.h> #include <utils/Timers.h> #include <utils/Trace.h> @@ -297,6 +299,7 @@ static bool IsFencePending(int fd) { } void ReleaseSwapchainImage(VkDevice device, + bool shared_present, ANativeWindow* window, int release_fence, Swapchain::Image& image, @@ -328,7 +331,8 @@ void ReleaseSwapchainImage(VkDevice device, } image.dequeue_fence = -1; - if (window) { + // It's invalid to call cancelBuffer on a shared buffer + if (window && !shared_present) { window->cancelBuffer(window, image.buffer.get(), release_fence); } else { if (release_fence >= 0) { @@ -362,9 +366,10 @@ void OrphanSwapchain(VkDevice device, Swapchain* swapchain) { if (swapchain->surface.swapchain_handle != HandleFromSwapchain(swapchain)) return; for (uint32_t i = 0; i < swapchain->num_images; i++) { - if (!swapchain->images[i].dequeued) - ReleaseSwapchainImage(device, nullptr, -1, swapchain->images[i], - true); + if (!swapchain->images[i].dequeued) { + ReleaseSwapchainImage(device, swapchain->shared, nullptr, -1, + swapchain->images[i], true); + } } swapchain->surface.swapchain_handle = VK_NULL_HANDLE; swapchain->timing.clear(); @@ -462,21 +467,24 @@ void copy_ready_timings(Swapchain& swapchain, *count = num_copied; } -android_pixel_format GetNativePixelFormat(VkFormat format) { - android_pixel_format native_format = HAL_PIXEL_FORMAT_RGBA_8888; +android::PixelFormat GetNativePixelFormat(VkFormat format) { + android::PixelFormat native_format = android::PIXEL_FORMAT_RGBA_8888; switch (format) { case VK_FORMAT_R8G8B8A8_UNORM: case VK_FORMAT_R8G8B8A8_SRGB: - native_format = HAL_PIXEL_FORMAT_RGBA_8888; + native_format = android::PIXEL_FORMAT_RGBA_8888; break; case VK_FORMAT_R5G6B5_UNORM_PACK16: - native_format = HAL_PIXEL_FORMAT_RGB_565; + native_format = android::PIXEL_FORMAT_RGB_565; break; case VK_FORMAT_R16G16B16A16_SFLOAT: - native_format = HAL_PIXEL_FORMAT_RGBA_FP16; + native_format = android::PIXEL_FORMAT_RGBA_FP16; break; case VK_FORMAT_A2B10G10R10_UNORM_PACK32: - native_format = HAL_PIXEL_FORMAT_RGBA_1010102; + native_format = android::PIXEL_FORMAT_RGBA_1010102; + break; + case VK_FORMAT_R8_UNORM: + native_format = android::PIXEL_FORMAT_R_8; break; default: ALOGV("unsupported swapchain format %d", format); @@ -805,6 +813,17 @@ VkResult GetPhysicalDeviceSurfaceFormatsKHR(VkPhysicalDevice pdev, } } + desc.format = AHARDWAREBUFFER_FORMAT_R8_UNORM; + if (AHardwareBuffer_isSupported(&desc)) { + all_formats.emplace_back( + VkSurfaceFormatKHR{VK_FORMAT_R8_UNORM, + VK_COLOR_SPACE_PASS_THROUGH_EXT}); + } + + // NOTE: Any new formats that are added must be coordinated across different + // Android users. This includes the ANGLE team (a layered implementation of + // OpenGL-ES). + VkResult result = VK_SUCCESS; if (formats) { uint32_t transfer_count = all_formats.size(); @@ -1067,7 +1086,8 @@ static void DestroySwapchainInternal(VkDevice device, } for (uint32_t i = 0; i < swapchain->num_images; i++) { - ReleaseSwapchainImage(device, window, -1, swapchain->images[i], false); + ReleaseSwapchainImage(device, swapchain->shared, window, -1, + swapchain->images[i], false); } if (active) { @@ -1106,7 +1126,7 @@ VkResult CreateSwapchainKHR(VkDevice device, if (!allocator) allocator = &GetData(device).allocator; - android_pixel_format native_pixel_format = + android::PixelFormat native_pixel_format = GetNativePixelFormat(create_info->imageFormat); android_dataspace native_dataspace = GetNativeDataspace(create_info->imageColorSpace); @@ -1203,8 +1223,8 @@ VkResult CreateSwapchainKHR(VkDevice device, err = native_window_set_buffers_format(window, native_pixel_format); if (err != android::OK) { - ALOGE("native_window_set_buffers_format(%d) failed: %s (%d)", - native_pixel_format, strerror(-err), err); + ALOGE("native_window_set_buffers_format(%s) failed: %s (%d)", + decodePixelFormat(native_pixel_format).c_str(), strerror(-err), err); return VK_ERROR_SURFACE_LOST_KHR; } err = native_window_set_buffers_data_space(window, native_dataspace); @@ -1837,7 +1857,8 @@ VkResult QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* present_info) { WorstPresentResult(swapchain_result, VK_SUBOPTIMAL_KHR); } } else { - ReleaseSwapchainImage(device, nullptr, fence, img, true); + ReleaseSwapchainImage(device, swapchain.shared, nullptr, fence, + img, true); swapchain_result = VK_ERROR_OUT_OF_DATE_KHR; } |