diff options
28 files changed, 299 insertions, 61 deletions
diff --git a/cmds/atrace/atrace.cpp b/cmds/atrace/atrace.cpp index ce0caede26..8f2dee180f 100644 --- a/cmds/atrace/atrace.cpp +++ b/cmds/atrace/atrace.cpp @@ -552,17 +552,13 @@ static void pokeHalServices() hidl_string instanceName = fqInstanceName.substr(n+1, std::string::npos); Return<sp<IBase>> interfaceRet = sm->get(fqInterfaceName, instanceName); if (!interfaceRet.isOk()) { - fprintf(stderr, "failed to get service %s: %s\n", - fqInstanceName.c_str(), - interfaceRet.description().c_str()); + // ignore continue; } sp<IBase> interface = interfaceRet; auto notifyRet = interface->notifySyspropsChanged(); if (!notifyRet.isOk()) { - fprintf(stderr, "failed to notifySyspropsChanged on service %s: %s\n", - fqInstanceName.c_str(), - notifyRet.description().c_str()); + // ignore } } }); diff --git a/include/android/hardware_buffer.h b/include/android/hardware_buffer.h index 24e217eefd..9c08c7b0b0 100644 --- a/include/android/hardware_buffer.h +++ b/include/android/hardware_buffer.h @@ -38,41 +38,48 @@ enum { * Vulkan: VK_FORMAT_R8G8B8A8_UNORM * OpenGL ES: GL_RGBA8 */ - AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM = 1, + AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM = 1, /** * Corresponding formats: * Vulkan: VK_FORMAT_R8G8B8A8_UNORM * OpenGL ES: GL_RGBA8 */ - AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM = 2, + AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM = 2, /** * Corresponding formats: * Vulkan: VK_FORMAT_R8G8B8_UNORM * OpenGL ES: GL_RGB8 */ - AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM = 3, + AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM = 3, /** * Corresponding formats: * Vulkan: VK_FORMAT_R5G6B5_UNORM_PACK16 * OpenGL ES: GL_RGB565 */ - AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM = 4, + AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM = 4, /** * Corresponding formats: * Vulkan: VK_FORMAT_R16G16B16A16_SFLOAT * OpenGL ES: GL_RGBA16F */ - AHARDWAREBUFFER_FORMAT_R16G16B16A16_SFLOAT = 0x16, + AHARDWAREBUFFER_FORMAT_R16G16B16A16_SFLOAT = 0x16, + + /** + * Corresponding formats: + * Vulkan: VK_FORMAT_A2R10G10B10_UNORM_PACK32 + * OpenGL ES: GL_RGB10_A2 + */ + AHARDWAREBUFFER_FORMAT_A2R10G10B10_UNORM_PACK32 = 0x2b, /** * An opaque binary blob format that must have height 1, with width equal to * the buffer size in bytes. */ - AHARDWAREBUFFER_FORMAT_BLOB = 0x21, + AHARDWAREBUFFER_FORMAT_BLOB = 0x21, }; enum { diff --git a/include/android/native_window.h b/include/android/native_window.h index 7d8d657424..6a46d7f93c 100644 --- a/include/android/native_window.h +++ b/include/android/native_window.h @@ -48,8 +48,6 @@ enum { WINDOW_FORMAT_RGBX_8888 = AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM, /** Red: 5 bits, Green: 6 bits, Blue: 5 bits. **/ WINDOW_FORMAT_RGB_565 = AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM, - /** Red: 16 bits, Green: 16 bits, Blue: 16 bits, Alpha: 16 bits. **/ - WINDOW_FORMAT_RGBA_FP16 = 0x16, }; struct ANativeWindow; diff --git a/include/ui/Fence.h b/include/ui/Fence.h index 58df24c4e0..37811bcd7c 100644 --- a/include/ui/Fence.h +++ b/include/ui/Fence.h @@ -23,8 +23,6 @@ #include <utils/RefBase.h> #include <utils/Timers.h> -#include <experimental/optional> - namespace android { class String8; @@ -105,26 +103,29 @@ public: // error occurs then SIGNAL_TIME_INVALID is returned. nsecs_t getSignalTime() const; -#if __cplusplus > 201103L - // hasSignaled returns whether the fence has signaled yet. Prefer this to + enum class Status { + Invalid, // Fence is invalid + Unsignaled, // Fence is valid but has not yet signaled + Signaled, // Fence is valid and has signaled + }; + + // getStatus() returns whether the fence has signaled yet. Prefer this to // getSignalTime() or wait() if all you care about is whether the fence has - // signaled. Returns an optional bool, which will have a value if there was - // no error. - inline std::experimental::optional<bool> hasSignaled() { + // signaled. + inline Status getStatus() { // The sync_wait call underlying wait() has been measured to be // significantly faster than the sync_fence_info call underlying // getSignalTime(), which might otherwise appear to be the more obvious // way to check whether a fence has signaled. switch (wait(0)) { case NO_ERROR: - return true; + return Status::Signaled; case -ETIME: - return false; + return Status::Unsignaled; default: - return {}; + return Status::Invalid; } } -#endif // Flattenable interface size_t getFlattenedSize() const; diff --git a/include/ui/PixelFormat.h b/include/ui/PixelFormat.h index ab7a9a37a5..02773d92fc 100644 --- a/include/ui/PixelFormat.h +++ b/include/ui/PixelFormat.h @@ -53,14 +53,15 @@ enum { // real pixel formats supported for rendering ----------------------------- - PIXEL_FORMAT_RGBA_8888 = HAL_PIXEL_FORMAT_RGBA_8888, // 4x8-bit RGBA - PIXEL_FORMAT_RGBX_8888 = HAL_PIXEL_FORMAT_RGBX_8888, // 4x8-bit RGB0 - PIXEL_FORMAT_RGB_888 = HAL_PIXEL_FORMAT_RGB_888, // 3x8-bit RGB - PIXEL_FORMAT_RGB_565 = HAL_PIXEL_FORMAT_RGB_565, // 16-bit RGB - PIXEL_FORMAT_BGRA_8888 = HAL_PIXEL_FORMAT_BGRA_8888, // 4x8-bit BGRA - PIXEL_FORMAT_RGBA_5551 = 6, // 16-bit ARGB - PIXEL_FORMAT_RGBA_4444 = 7, // 16-bit ARGB - PIXEL_FORMAT_RGBA_FP16 = HAL_PIXEL_FORMAT_RGBA_FP16, // 64-bit RGBA + PIXEL_FORMAT_RGBA_8888 = HAL_PIXEL_FORMAT_RGBA_8888, // 4x8-bit RGBA + PIXEL_FORMAT_RGBX_8888 = HAL_PIXEL_FORMAT_RGBX_8888, // 4x8-bit RGB0 + PIXEL_FORMAT_RGB_888 = HAL_PIXEL_FORMAT_RGB_888, // 3x8-bit RGB + PIXEL_FORMAT_RGB_565 = HAL_PIXEL_FORMAT_RGB_565, // 16-bit RGB + PIXEL_FORMAT_BGRA_8888 = HAL_PIXEL_FORMAT_BGRA_8888, // 4x8-bit BGRA + PIXEL_FORMAT_RGBA_5551 = 6, // 16-bit ARGB + PIXEL_FORMAT_RGBA_4444 = 7, // 16-bit ARGB + PIXEL_FORMAT_RGBA_FP16 = HAL_PIXEL_FORMAT_RGBA_FP16, // 64-bit RGBA + PIXEL_FORMAT_RGBA_1010102 = HAL_PIXEL_FORMAT_RGBA_1010102, // 32-bit RGBA }; typedef int32_t PixelFormat; diff --git a/libs/gui/BufferQueueProducer.cpp b/libs/gui/BufferQueueProducer.cpp index 3f69b1f602..0cbafcf864 100644 --- a/libs/gui/BufferQueueProducer.cpp +++ b/libs/gui/BufferQueueProducer.cpp @@ -1222,6 +1222,9 @@ status_t BufferQueueProducer::disconnect(int api, DisconnectMode mode) { } if (api == BufferQueueCore::CURRENTLY_CONNECTED_API) { + if (mCore->mConnectedApi == NATIVE_WINDOW_API_MEDIA) { + ALOGD("About to force-disconnect API_MEDIA, mode=%d", mode); + } api = mCore->mConnectedApi; // If we're asked to disconnect the currently connected api but // nobody is connected, it's not really an error. diff --git a/libs/gui/ConsumerBase.cpp b/libs/gui/ConsumerBase.cpp index be2b1afd36..c26de6673b 100644 --- a/libs/gui/ConsumerBase.cpp +++ b/libs/gui/ConsumerBase.cpp @@ -318,16 +318,16 @@ status_t ConsumerBase::addReleaseFenceLocked(int slot, return OK; } - auto signaled = mSlots[slot].mFence->hasSignaled(); + auto status = mSlots[slot].mFence->getStatus(); - if (!signaled) { + if (status == Fence::Status::Invalid) { CB_LOGE("fence has invalid state"); return BAD_VALUE; } - if (*signaled) { + if (status == Fence::Status::Signaled) { mSlots[slot].mFence = fence; - } else { + } else { // status == Fence::Status::Unsignaled char fenceName[32] = {}; snprintf(fenceName, 32, "%.28s:%d", mName.string(), slot); sp<Fence> mergedFence = Fence::merge( diff --git a/libs/gui/CpuConsumer.cpp b/libs/gui/CpuConsumer.cpp index a9bafef8b6..ae7c65c441 100644 --- a/libs/gui/CpuConsumer.cpp +++ b/libs/gui/CpuConsumer.cpp @@ -65,6 +65,7 @@ static bool isPossiblyYUV(PixelFormat format) { case HAL_PIXEL_FORMAT_RGBA_8888: case HAL_PIXEL_FORMAT_RGBX_8888: case HAL_PIXEL_FORMAT_RGBA_FP16: + case HAL_PIXEL_FORMAT_RGBA_1010102: case HAL_PIXEL_FORMAT_RGB_888: case HAL_PIXEL_FORMAT_RGB_565: case HAL_PIXEL_FORMAT_BGRA_8888: diff --git a/libs/gui/GLConsumer.cpp b/libs/gui/GLConsumer.cpp index 9532c52ee4..55e0d264bb 100644 --- a/libs/gui/GLConsumer.cpp +++ b/libs/gui/GLConsumer.cpp @@ -863,6 +863,7 @@ void GLConsumer::computeTransformMatrix(float outTransform[16], case PIXEL_FORMAT_RGBA_8888: case PIXEL_FORMAT_RGBX_8888: case PIXEL_FORMAT_RGBA_FP16: + case PIXEL_FORMAT_RGBA_1010102: case PIXEL_FORMAT_RGB_888: case PIXEL_FORMAT_RGB_565: case PIXEL_FORMAT_BGRA_8888: diff --git a/libs/ui/PixelFormat.cpp b/libs/ui/PixelFormat.cpp index 734472d2b1..e88fdd5e84 100644 --- a/libs/ui/PixelFormat.cpp +++ b/libs/ui/PixelFormat.cpp @@ -27,6 +27,7 @@ uint32_t bytesPerPixel(PixelFormat format) { case PIXEL_FORMAT_RGBA_8888: case PIXEL_FORMAT_RGBX_8888: case PIXEL_FORMAT_BGRA_8888: + case PIXEL_FORMAT_RGBA_1010102: return 4; case PIXEL_FORMAT_RGB_888: return 3; @@ -45,6 +46,7 @@ uint32_t bitsPerPixel(PixelFormat format) { case PIXEL_FORMAT_RGBA_8888: case PIXEL_FORMAT_RGBX_8888: case PIXEL_FORMAT_BGRA_8888: + case PIXEL_FORMAT_RGBA_1010102: return 32; case PIXEL_FORMAT_RGB_888: return 24; diff --git a/opengl/include/EGL/eglext.h b/opengl/include/EGL/eglext.h index 6572cab466..df84c934de 100644 --- a/opengl/include/EGL/eglext.h +++ b/opengl/include/EGL/eglext.h @@ -619,6 +619,16 @@ typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLCREATENATIVECLIENTBUFFERANDROID) (co #endif #endif +#ifndef EGL_ANDROID_get_native_client_buffer +#define EGL_ANDROID_get_native_client_buffer 1 +struct AHardwareBuffer; +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLClientBuffer eglGetNativeClientBufferANDROID (const AHardwareBuffer *buffer); +#else +typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLGETNATIVECLIENTBUFFERANDROID) (const AHardwareBuffer *buffer); +#endif +#endif + #ifndef EGL_ANDROID_front_buffer_auto_refresh #define EGL_ANDROID_front_buffer_auto_refresh 1 #define EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID 0x314C diff --git a/opengl/libs/EGL/eglApi.cpp b/opengl/libs/EGL/eglApi.cpp index 4681b89aa6..ef3d7a3fa2 100644 --- a/opengl/libs/EGL/eglApi.cpp +++ b/opengl/libs/EGL/eglApi.cpp @@ -27,6 +27,7 @@ #include <EGL/egl.h> #include <EGL/eglext.h> +#include <android/hardware_buffer.h> #include <cutils/atomic.h> #include <cutils/compiler.h> #include <cutils/memory.h> @@ -85,6 +86,7 @@ extern char const * const gBuiltinExtensionString = "EGL_ANDROID_presentation_time " "EGL_KHR_swap_buffers_with_damage " "EGL_ANDROID_create_native_client_buffer " + "EGL_ANDROID_get_native_client_buffer " "EGL_ANDROID_front_buffer_auto_refresh " "EGL_ANDROID_get_frame_timestamps " ; @@ -178,10 +180,14 @@ static const extention_map_t sExtensionMap[] = { { "eglSwapBuffersWithDamageKHR", (__eglMustCastToProperFunctionPointerType)&eglSwapBuffersWithDamageKHR }, - // EGL_ANDROID_native_client_buffer + // EGL_ANDROID_create_native_client_buffer { "eglCreateNativeClientBufferANDROID", (__eglMustCastToProperFunctionPointerType)&eglCreateNativeClientBufferANDROID }, + // EGL_ANDROID_get_native_client_buffer + { "eglGetNativeClientBufferANDROID", + (__eglMustCastToProperFunctionPointerType)&eglGetNativeClientBufferANDROID }, + // EGL_KHR_partial_update { "eglSetDamageRegionKHR", (__eglMustCastToProperFunctionPointerType)&eglSetDamageRegionKHR }, @@ -1980,6 +1986,17 @@ error_condition: return setError(EGL_BAD_ALLOC, (EGLClientBuffer)0); } +EGLClientBuffer eglGetNativeClientBufferANDROID(const AHardwareBuffer *buffer) { + clearError(); + + if (!buffer) return setError(EGL_BAD_PARAMETER, (EGLClientBuffer)0); + + // FIXME: remove this dangerous reinterpret_cast. + const GraphicBuffer* graphicBuffer = + reinterpret_cast<const GraphicBuffer*>(buffer); + return static_cast<EGLClientBuffer>(graphicBuffer->getNativeBuffer()); +} + // ---------------------------------------------------------------------------- // NVIDIA extensions // ---------------------------------------------------------------------------- diff --git a/opengl/libs/EGL/egl_entries.in b/opengl/libs/EGL/egl_entries.in index 2b567187ba..b587a16203 100644 --- a/opengl/libs/EGL/egl_entries.in +++ b/opengl/libs/EGL/egl_entries.in @@ -81,6 +81,7 @@ EGL_ENTRY(EGLBoolean, eglSetSwapRectangleANDROID, EGLDisplay, EGLSurface, EGLint EGL_ENTRY(EGLClientBuffer, eglGetRenderBufferANDROID, EGLDisplay, EGLSurface) EGL_ENTRY(EGLint, eglDupNativeFenceFDANDROID, EGLDisplay, EGLSyncKHR) EGL_ENTRY(EGLClientBuffer, eglCreateNativeClientBufferANDROID, const EGLint *) +EGL_ENTRY(EGLClientBuffer, eglGetNativeClientBufferANDROID, const AHardwareBuffer *) /* NVIDIA extensions */ diff --git a/opengl/libs/libEGL.map.txt b/opengl/libs/libEGL.map.txt index c8b83f544e..89269a0231 100644 --- a/opengl/libs/libEGL.map.txt +++ b/opengl/libs/libEGL.map.txt @@ -28,6 +28,7 @@ LIBEGL { eglGetCurrentSurface; eglGetDisplay; eglGetError; + eglGetNativeClientBufferANDROID; # introduced=26 eglGetProcAddress; eglGetStreamFileDescriptorKHR; # introduced=23 eglGetSyncAttribKHR; # introduced-arm=18 introduced-arm64=21 introduced-mips=18 introduced-mips64=21 introduced-x86=18 introduced-x86_64=21 diff --git a/opengl/specs/EGL_ANDROID_get_native_client_buffer.txt b/opengl/specs/EGL_ANDROID_get_native_client_buffer.txt new file mode 100644 index 0000000000..de012a0c30 --- /dev/null +++ b/opengl/specs/EGL_ANDROID_get_native_client_buffer.txt @@ -0,0 +1,96 @@ +Name + + ANDROID_get_native_client_buffer + +Name Strings + + EGL_ANDROID_get_native_client_buffer + +Contributors + + Craig Donner + +Contact + + Craig Donner, Google Inc. (cdonner 'at' google.com) + +Status + + Draft + +Version + + Version 1.0, January 27, 2017 + +Number + + EGL Extension #XXX + +Dependencies + + Requires EGL 1.2. + + EGL_ANDROID_image_native_buffer and EGL_KHR_image_base are required. + + This extension is written against the wording of the EGL 1.2 + Specification as modified by EGL_KHR_image_base and + EGL_ANDROID_image_native_buffer. + +Overview + + This extension allows creating an EGLClientBuffer from an Android + AHardwareBuffer object which can be later used to create an EGLImage. + +New Types + +struct AHardwareBuffer + +New Procedures and Functions + +EGLClientBuffer eglGetNativeClientBufferANDROID(const AHardwareBuffer *buffer) + +New Tokens + + None + +Changes to Chapter 3 of the EGL 1.2 Specification (EGL Functions and Errors) + + Add the following to section 2.5.1 "EGLImage Specification" (as modified by + the EGL_KHR_image_base and EGL_ANDROID_image_native_buffer specifications), + below the description of eglCreateImageKHR: + + "The command + + EGLClientBuffer eglGeteNativeClientBufferANDROID( + AHardwareBuffer *buffer) + + may be used to create an EGLClientBuffer from an AHardwareBuffer object. + EGL implementations must guarantee that the lifetime of the returned + EGLClientBuffer is at least as long as the EGLImage(s) it is bound to, + following the lifetime semantics described below in section 2.5.2; the + EGLClientBuffer must be destroyed no earlier than when all of its associated + EGLImages are destroyed by eglDestroyImageKHR. + + Errors + + If eglGeteNativeClientBufferANDROID fails, NULL will be returned, no + memory will be allocated, and the following error will be generated: + + * If the value of buffer is NULL, the error EGL_BAD_PARAMETER is + generated. + +Issues + + 1. Should this extension define what particular AHardwareBuffer formats EGL + implementations are required to support? + + RESOLVED: No. + + The set of valid formats is implementation-specific and may depend on + additional EGL extensions. The particular valid combinations for a given + Android version and implementation should be documented by that version. + +Revision History + +#1 (Craig Donner, January 27, 2017) + - Initial draft. diff --git a/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.cpp b/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.cpp index 0bfc56e6a8..bb815cc393 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.cpp +++ b/services/surfaceflinger/DisplayHardware/HWComposer_hwc1.cpp @@ -1160,6 +1160,7 @@ static String8 getFormatStr(PixelFormat format) { case PIXEL_FORMAT_RGBA_8888: return String8("RGBA_8888"); case PIXEL_FORMAT_RGBX_8888: return String8("RGBx_8888"); case PIXEL_FORMAT_RGBA_FP16: return String8("RGBA_FP16"); + case PIXEL_FORMAT_RGBA_1010102: return String8("RGBA_1010102"); case PIXEL_FORMAT_RGB_888: return String8("RGB_888"); case PIXEL_FORMAT_RGB_565: return String8("RGB_565"); case PIXEL_FORMAT_BGRA_8888: return String8("BGRA_8888"); diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index a854aec4bd..0eef708afd 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -1305,6 +1305,7 @@ bool Layer::getOpacityForFormat(uint32_t format) { case HAL_PIXEL_FORMAT_RGBA_8888: case HAL_PIXEL_FORMAT_BGRA_8888: case HAL_PIXEL_FORMAT_RGBA_FP16: + case HAL_PIXEL_FORMAT_RGBA_1010102: return false; } // in all other case, we have no blending (also for unknown formats) diff --git a/services/vr/vr_window_manager/surface_flinger_view.cpp b/services/vr/vr_window_manager/surface_flinger_view.cpp index 7b17420913..d42d3ff333 100644 --- a/services/vr/vr_window_manager/surface_flinger_view.cpp +++ b/services/vr/vr_window_manager/surface_flinger_view.cpp @@ -14,16 +14,29 @@ SurfaceFlingerView::SurfaceFlingerView() {} SurfaceFlingerView::~SurfaceFlingerView() {} bool SurfaceFlingerView::Initialize(HwcCallback::Client *client) { - sp<IComposer> vr_hwcomposer = IComposer::getService("vr_hwcomposer"); - if (!vr_hwcomposer.get()) { - ALOGE("vr_hwcomposer not registered as service"); + const char vr_hwcomposer_name[] = "vr_hwcomposer"; + vr_hwcomposer_ = HIDL_FETCH_IComposer(vr_hwcomposer_name); + if (!vr_hwcomposer_.get()) { + ALOGE("Failed to get vr_hwcomposer"); + return false; + } + + if (vr_hwcomposer_->isRemote()) { + ALOGE("vr_hwcomposer service is remote"); + return false; + } + + const android::status_t vr_hwcomposer_status = + vr_hwcomposer_->registerAsService(vr_hwcomposer_name); + if (vr_hwcomposer_status != OK) { + ALOGE("Failed to register vr_hwcomposer service"); return false; } vr_composer_view_ = std::make_unique<VrComposerView>(std::make_unique<HwcCallback>(client)); vr_composer_view_->Initialize(GetComposerViewFromIComposer( - vr_hwcomposer.get())); + vr_hwcomposer_.get())); // TODO(dnicoara): Query this from the composer service. width_ = 1920; diff --git a/services/vr/vr_window_manager/surface_flinger_view.h b/services/vr/vr_window_manager/surface_flinger_view.h index 8d9b44ea26..9c16192322 100644 --- a/services/vr/vr_window_manager/surface_flinger_view.h +++ b/services/vr/vr_window_manager/surface_flinger_view.h @@ -39,6 +39,7 @@ class SurfaceFlingerView { void ReleaseFrame(); private: + sp<IComposer> vr_hwcomposer_; std::unique_ptr<VrComposerView> vr_composer_view_; int width_ = 0; int height_ = 0; diff --git a/services/vr/vr_window_manager/vr_window_manager.cpp b/services/vr/vr_window_manager/vr_window_manager.cpp index 5e9215c16c..6636dc5606 100644 --- a/services/vr/vr_window_manager/vr_window_manager.cpp +++ b/services/vr/vr_window_manager/vr_window_manager.cpp @@ -14,18 +14,6 @@ using namespace android::dvr; int main(int /* argc */, char** /* argv */) { android::ProcessState::self()->startThreadPool(); - // Create vr_hwcomposer. - const char vr_hwcomposer_name[] = "vr_hwcomposer"; - sp<IComposer> vr_hwcomposer = HIDL_FETCH_IComposer(vr_hwcomposer_name); - LOG_ALWAYS_FATAL_IF(!vr_hwcomposer.get(), "Failed to get vr_hwcomposer"); - LOG_ALWAYS_FATAL_IF(vr_hwcomposer->isRemote(), - "vr_hwcomposer service is remote"); - - const android::status_t vr_hwcomposer_status = - vr_hwcomposer->registerAsService(vr_hwcomposer_name); - LOG_ALWAYS_FATAL_IF(vr_hwcomposer_status != ::android::OK, - "Failed to register vr_hwcomposer service"); - // ShellView needs to be created after vr_hwcomposer. android::dvr::ShellView app; const int app_status = app.Initialize(); diff --git a/vulkan/api/vulkan.api b/vulkan/api/vulkan.api index a89fed93cd..eed44ad670 100644 --- a/vulkan/api/vulkan.api +++ b/vulkan/api/vulkan.api @@ -153,6 +153,8 @@ define NULL_HANDLE 0 @extension("VK_KHR_shared_presentable_image") define VK_KHR_SHARED_PRESENTABLE_IMAGE_SPEC_VERSION 1 @extension("VK_KHR_shared_presentable_image") define VK_KHR_SHARED_PRESENTABLE_IMAGE_EXTENSION_NAME "VK_KHR_shared_presentable_image" +@extension("VK_EXT_HDR_METADATA_SPEC_VERSION") define VK_EXT_HDR_METADATA_SPEC_VERSION 1 +@extension("VK_EXT_HDR_METADATA_EXTENSION_NAME") define VK_EXT_HDR_METADATA_EXTENSION_NAME "VK_EXT_hdr_metadata" ///////////// @@ -3303,6 +3305,24 @@ class VkObjectTablePushConstantEntryNVX { VkShaderStageFlags stageFlags } +@extension("VK_EXT_hdr_metadata") +class VkXYColorEXT { + f32 x + f32 y +} + +@extension("VK_EXT_hdr_metadata") +class VkHdrMetadataEXT { + VkXYColorEXT displayPrimaryRed + VkXYColorEXT displayPrimaryGreen + VkXYColorEXT displayPrimaryBlue + VkXYColorEXT whitePoint + f32 maxLuminance + f32 minLuminance + f32 maxContentLightLevel + f32 maxFrameAverageLightLevel +} + //////////////// @@ -6147,6 +6167,14 @@ cmd VkResult vkGetSwapchainStatusKHR( return ? } +@extension("VK_EXT_hdr_metadata") +cmd void vkSetHdrMetadataEXT( + VkDevice device, + u32 swapchainCount, + const VkSwapchainKHR* pSwapchains, + const VkHdrMetadataEXT* pMetadata) { +} + //////////////// // Validation // diff --git a/vulkan/include/vulkan/vulkan.h b/vulkan/include/vulkan/vulkan.h index 8d24aa738f..16f43e5e7c 100644 --- a/vulkan/include/vulkan/vulkan.h +++ b/vulkan/include/vulkan/vulkan.h @@ -6,7 +6,7 @@ extern "C" { #endif /* -** Copyright (c) 2015-2016 The Khronos Group Inc. +** Copyright (c) 2015-2017 The Khronos Group Inc. ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. @@ -4608,6 +4608,39 @@ VKAPI_ATTR void VKAPI_CALL vkGetPhysicalDeviceGeneratedCommandsPropertiesNVX( VkDeviceGeneratedCommandsLimitsNVX* pLimits); #endif +#define VK_EXT_hdr_metadata 1 +#define VK_EXT_HDR_METADATA_SPEC_VERSION 0 +#define VK_EXT_HDR_METADATA_EXTENSION_NAME "VK_EXT_hdr_metadata" + +typedef struct VkXYColorEXT { + float x; + float y; +} VkXYColorEXT; + +typedef struct VkHdrMetadataEXT { + VkStructureType sType; + const void* pNext; + VkXYColorEXT displayPrimaryRed; + VkXYColorEXT displayPrimaryGreen; + VkXYColorEXT displayPrimaryBlue; + VkXYColorEXT whitePoint; + float maxLuminance; + float minLuminance; + float maxContentLightLevel; + float maxFrameAverageLightLevel; +} VkHdrMetadataEXT; + + +typedef void (VKAPI_PTR *PFN_vkSetHdrMetadataEXT)(VkDevice device, uint32_t swapchainCount, const VkSwapchainKHR* pSwapchains, const VkHdrMetadataEXT* pMetadata); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkSetHdrMetadataEXT( + VkDevice device, + uint32_t swapchainCount, + const VkSwapchainKHR* pSwapchains, + const VkHdrMetadataEXT* pMetadata); +#endif + #ifdef __cplusplus } #endif diff --git a/vulkan/libvulkan/code-generator.tmpl b/vulkan/libvulkan/code-generator.tmpl index e3c44d28c6..caf38bcb69 100644 --- a/vulkan/libvulkan/code-generator.tmpl +++ b/vulkan/libvulkan/code-generator.tmpl @@ -682,11 +682,12 @@ bool InitDriverTable(VkDevice dev, PFN_vkGetDeviceProcAddr get_proc, {{define "driver.InterceptedExtensions"}} VK_ANDROID_native_buffer VK_EXT_debug_report +VK_EXT_hdr_metadata +VK_GOOGLE_display_timing VK_KHR_android_surface VK_KHR_incremental_present VK_KHR_surface VK_KHR_swapchain -VK_GOOGLE_display_timing VK_KHR_shared_presentable_image {{end}} @@ -1127,8 +1128,9 @@ VK_KHR_shared_presentable_image {{/* ------------------------------------------------------------------------------ - Reports whether an extension is implemented entirely by the loader, - so drivers should not enumerate it. + Reports whether an extension has functions exported by the loader. + E.g. applications can directly link to an extension function. + Currently only support WSI extensions this way. ------------------------------------------------------------------------------ */}} {{define "IsExtensionExported"}} diff --git a/vulkan/libvulkan/driver.cpp b/vulkan/libvulkan/driver.cpp index 32f777dc87..71bfecfd56 100644 --- a/vulkan/libvulkan/driver.cpp +++ b/vulkan/libvulkan/driver.cpp @@ -472,6 +472,9 @@ void CreateInfoWrapper::FilterExtension(const char* name) { hook_extensions_.set(ext_bit); // return now as these extensions do not require HAL support return; + case ProcHook::EXT_hdr_metadata: + hook_extensions_.set(ext_bit); + break; case ProcHook::EXTENSION_UNKNOWN: // HAL's extensions break; @@ -737,12 +740,14 @@ VkResult EnumerateDeviceExtensionProperties( uint32_t* pPropertyCount, VkExtensionProperties* pProperties) { const InstanceData& data = GetData(physicalDevice); - static const std::array<VkExtensionProperties, 2> loader_extensions = {{ + static const std::array<VkExtensionProperties, 3> loader_extensions = {{ // WSI extensions {VK_KHR_INCREMENTAL_PRESENT_EXTENSION_NAME, VK_KHR_INCREMENTAL_PRESENT_SPEC_VERSION}, {VK_GOOGLE_DISPLAY_TIMING_EXTENSION_NAME, VK_GOOGLE_DISPLAY_TIMING_SPEC_VERSION}, + {VK_EXT_HDR_METADATA_EXTENSION_NAME, + VK_EXT_HDR_METADATA_SPEC_VERSION}, }}; // enumerate our extensions first diff --git a/vulkan/libvulkan/driver_gen.cpp b/vulkan/libvulkan/driver_gen.cpp index 951ea6e571..59964fb2c9 100644 --- a/vulkan/libvulkan/driver_gen.cpp +++ b/vulkan/libvulkan/driver_gen.cpp @@ -102,6 +102,14 @@ VKAPI_ATTR VkResult checkedGetSwapchainStatusKHR(VkDevice device, VkSwapchainKHR } } +VKAPI_ATTR void checkedSetHdrMetadataEXT(VkDevice device, uint32_t swapchainCount, const VkSwapchainKHR* pSwapchains, const VkHdrMetadataEXT* pMetadata) { + if (GetData(device).hook_extensions[ProcHook::EXT_hdr_metadata]) { + SetHdrMetadataEXT(device, swapchainCount, pSwapchains, pMetadata); + } else { + Logger(device).Err(device, "VK_EXT_hdr_metadata not enabled. vkSetHdrMetadataEXT not executed."); + } +} + // clang-format on const ProcHook g_proc_hooks[] = { @@ -330,6 +338,13 @@ const ProcHook g_proc_hooks[] = { nullptr, nullptr, }, + { + "vkSetHdrMetadataEXT", + ProcHook::DEVICE, + ProcHook::EXT_hdr_metadata, + reinterpret_cast<PFN_vkVoidFunction>(SetHdrMetadataEXT), + reinterpret_cast<PFN_vkVoidFunction>(checkedSetHdrMetadataEXT), + }, // clang-format on }; @@ -349,11 +364,12 @@ ProcHook::Extension GetProcHookExtension(const char* name) { // clang-format off if (strcmp(name, "VK_ANDROID_native_buffer") == 0) return ProcHook::ANDROID_native_buffer; if (strcmp(name, "VK_EXT_debug_report") == 0) return ProcHook::EXT_debug_report; + if (strcmp(name, "VK_EXT_hdr_metadata") == 0) return ProcHook::EXT_hdr_metadata; + if (strcmp(name, "VK_GOOGLE_display_timing") == 0) return ProcHook::GOOGLE_display_timing; if (strcmp(name, "VK_KHR_android_surface") == 0) return ProcHook::KHR_android_surface; if (strcmp(name, "VK_KHR_incremental_present") == 0) return ProcHook::KHR_incremental_present; if (strcmp(name, "VK_KHR_surface") == 0) return ProcHook::KHR_surface; if (strcmp(name, "VK_KHR_swapchain") == 0) return ProcHook::KHR_swapchain; - if (strcmp(name, "VK_GOOGLE_display_timing") == 0) return ProcHook::GOOGLE_display_timing; if (strcmp(name, "VK_KHR_shared_presentable_image") == 0) return ProcHook::KHR_shared_presentable_image; // clang-format on return ProcHook::EXTENSION_UNKNOWN; diff --git a/vulkan/libvulkan/driver_gen.h b/vulkan/libvulkan/driver_gen.h index 95c70f8fce..273e796d84 100644 --- a/vulkan/libvulkan/driver_gen.h +++ b/vulkan/libvulkan/driver_gen.h @@ -35,11 +35,12 @@ struct ProcHook { enum Extension { ANDROID_native_buffer, EXT_debug_report, + EXT_hdr_metadata, + GOOGLE_display_timing, KHR_android_surface, KHR_incremental_present, KHR_surface, KHR_swapchain, - GOOGLE_display_timing, KHR_shared_presentable_image, EXTENSION_CORE, // valid bit diff --git a/vulkan/libvulkan/swapchain.cpp b/vulkan/libvulkan/swapchain.cpp index 9630ac99f2..b1e3d61cf1 100644 --- a/vulkan/libvulkan/swapchain.cpp +++ b/vulkan/libvulkan/swapchain.cpp @@ -1351,5 +1351,18 @@ VkResult GetSwapchainStatusKHR( return result; } +VKAPI_ATTR void SetHdrMetadataEXT( + VkDevice device, + uint32_t swapchainCount, + const VkSwapchainKHR* pSwapchains, + const VkHdrMetadataEXT* pHdrMetadataEXTs) { + // TODO: courtneygo: implement actual function + (void)device; + (void)swapchainCount; + (void)pSwapchains; + (void)pHdrMetadataEXTs; + return; +} + } // namespace driver } // namespace vulkan diff --git a/vulkan/libvulkan/swapchain.h b/vulkan/libvulkan/swapchain.h index 91d72193c1..4d9f18f301 100644 --- a/vulkan/libvulkan/swapchain.h +++ b/vulkan/libvulkan/swapchain.h @@ -37,6 +37,7 @@ VKAPI_ATTR VkResult QueuePresentKHR(VkQueue queue, const VkPresentInfoKHR* prese VKAPI_ATTR VkResult GetRefreshCycleDurationGOOGLE(VkDevice device, VkSwapchainKHR swapchain, VkRefreshCycleDurationGOOGLE* pDisplayTimingProperties); VKAPI_ATTR VkResult GetPastPresentationTimingGOOGLE(VkDevice device, VkSwapchainKHR swapchain, uint32_t* pPresentationTimingCount, VkPastPresentationTimingGOOGLE* pPresentationTimings); VKAPI_ATTR VkResult GetSwapchainStatusKHR(VkDevice device, VkSwapchainKHR swapchain); +VKAPI_ATTR void SetHdrMetadataEXT(VkDevice device, uint32_t swapchainCount, const VkSwapchainKHR* pSwapchains, const VkHdrMetadataEXT* pHdrMetadataEXTs); // clang-format on } // namespace driver |