aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoman Kiryanov <rkir@google.com>2019-04-26 10:45:46 -0700
committerRoman Kiryanov <rkir@google.com>2019-04-30 12:49:16 -0700
commit77379152398af03ccf7bb09ffcacb940f58047a4 (patch)
treea7a8b0d9f78d0c98cfe7408131135dd94066cfb4
parent4a9bb444760b6d2d8a85618bbee582b8b47a802f (diff)
downloaddevice_generic_goldfish-opengl-77379152398af03ccf7bb09ffcacb940f58047a4.tar.gz
device_generic_goldfish-opengl-77379152398af03ccf7bb09ffcacb940f58047a4.tar.bz2
device_generic_goldfish-opengl-77379152398af03ccf7bb09ffcacb940f58047a4.zip
vk_find_struct: use the requested type to calculate sType
Add the type->id mapping to get Vulkan struct sType at compile time. This will produce a compile time error for unknown types. Bug: 131181334 Test: make Change-Id: Ib3003195d686ba20b3ea16a3215c4e6d07426fb7 Merged-In: I47800f6068cb21eabac935cf5873faee7e5a2854
-rw-r--r--system/vulkan_enc/AndroidHardwareBuffer.cpp4
-rw-r--r--system/vulkan_enc/ResourceTracker.cpp82
-rw-r--r--system/vulkan_enc/goldfish_vk_private_defs.h29
-rw-r--r--system/vulkan_enc/vk_struct_id.h56
-rw-r--r--system/vulkan_enc/vk_util.h23
5 files changed, 112 insertions, 82 deletions
diff --git a/system/vulkan_enc/AndroidHardwareBuffer.cpp b/system/vulkan_enc/AndroidHardwareBuffer.cpp
index 6bc1484f..5cebdc28 100644
--- a/system/vulkan_enc/AndroidHardwareBuffer.cpp
+++ b/system/vulkan_enc/AndroidHardwareBuffer.cpp
@@ -59,9 +59,7 @@ VkResult getAndroidHardwareBufferPropertiesANDROID(
VkAndroidHardwareBufferPropertiesANDROID* pProperties) {
VkAndroidHardwareBufferFormatPropertiesANDROID* ahbFormatProps =
- vk_find_struct<VkAndroidHardwareBufferFormatPropertiesANDROID>(
- pProperties,
- VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID);
+ vk_find_struct<VkAndroidHardwareBufferFormatPropertiesANDROID>(pProperties);
if (ahbFormatProps) {
AHardwareBuffer_Desc desc;
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index 3b5bdb85..623859a5 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -14,6 +14,7 @@
// limitations under the License.
#include "ResourceTracker.h"
+#include "goldfish_vk_private_defs.h"
#include "../OpenglSystemCommon/EmulatorFeatureInfo.h"
@@ -26,31 +27,6 @@ typedef uint32_t zx_handle_t;
void zx_handle_close(zx_handle_t) { }
void zx_event_create(int, zx_handle_t*) { }
-typedef struct VkImportMemoryZirconHandleInfoFUCHSIA {
- VkStructureType sType;
- const void* pNext;
- VkExternalMemoryHandleTypeFlagBits handleType;
- uint32_t handle;
-} VkImportMemoryZirconHandleInfoFUCHSIA;
-
-typedef uint32_t VkBufferCollectionFUCHSIA;
-
-typedef struct VkImportMemoryBufferCollectionFUCHSIA {
- VkStructureType sType;
- const void* pNext;
- VkBufferCollectionFUCHSIA collection;
- uint32_t index;
-} VkImportMemoryBufferCollectionFUCHSIA;
-
-#define VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA \
- ((VkStructureType)1001000000)
-#define VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA \
- ((VkStructureType)1001000000)
-#define VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA \
- ((VkStructureType)0x00000800)
-#define VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TEMP_ZIRCON_EVENT_BIT_FUCHSIA \
- ((VkStructureType)0x00000020)
-
#include "AndroidHardwareBuffer.h"
#endif // VK_USE_PLATFORM_ANDROID_KHR
@@ -1548,24 +1524,19 @@ public:
// };
const VkExportMemoryAllocateInfo* exportAllocateInfoPtr =
- vk_find_struct<VkExportMemoryAllocateInfo>(pAllocateInfo,
- VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO);
+ vk_find_struct<VkExportMemoryAllocateInfo>(pAllocateInfo);
const VkImportAndroidHardwareBufferInfoANDROID* importAhbInfoPtr =
- vk_find_struct<VkImportAndroidHardwareBufferInfoANDROID>(pAllocateInfo,
- VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID);
+ vk_find_struct<VkImportAndroidHardwareBufferInfoANDROID>(pAllocateInfo);
const VkImportMemoryBufferCollectionFUCHSIA* importBufferCollectionInfoPtr =
- vk_find_struct<VkImportMemoryBufferCollectionFUCHSIA>(pAllocateInfo,
- VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA);
+ vk_find_struct<VkImportMemoryBufferCollectionFUCHSIA>(pAllocateInfo);
const VkImportMemoryZirconHandleInfoFUCHSIA* importVmoInfoPtr =
- vk_find_struct<VkImportMemoryZirconHandleInfoFUCHSIA>(pAllocateInfo,
- VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA);
+ vk_find_struct<VkImportMemoryZirconHandleInfoFUCHSIA>(pAllocateInfo);
const VkMemoryDedicatedAllocateInfo* dedicatedAllocInfoPtr =
- vk_find_struct<VkMemoryDedicatedAllocateInfo>(pAllocateInfo,
- VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO);
+ vk_find_struct<VkMemoryDedicatedAllocateInfo>(pAllocateInfo);
bool shouldPassThroughDedicatedAllocInfo =
!exportAllocateInfoPtr &&
@@ -2116,8 +2087,7 @@ public:
transformExternalResourceMemoryRequirementsForGuest(&reqs2->memoryRequirements);
VkMemoryDedicatedRequirements* dedicatedReqs =
- vk_find_struct<VkMemoryDedicatedRequirements>(
- reqs2, VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS);
+ vk_find_struct<VkMemoryDedicatedRequirements>(reqs2);
if (!dedicatedReqs) return;
@@ -2146,8 +2116,7 @@ public:
transformExternalResourceMemoryRequirementsForGuest(&reqs2->memoryRequirements);
VkMemoryDedicatedRequirements* dedicatedReqs =
- vk_find_struct<VkMemoryDedicatedRequirements>(
- reqs2, VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS);
+ vk_find_struct<VkMemoryDedicatedRequirements>(reqs2);
if (!dedicatedReqs) return;
@@ -2167,9 +2136,7 @@ public:
VkExternalMemoryImageCreateInfo localExtImgCi;
const VkExternalMemoryImageCreateInfo* extImgCiPtr =
- vk_find_struct<VkExternalMemoryImageCreateInfo>(
- pCreateInfo,
- VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO);
+ vk_find_struct<VkExternalMemoryImageCreateInfo>(pCreateInfo);
if (extImgCiPtr) {
localExtImgCi = vk_make_orphan_copy(*extImgCiPtr);
vk_append_struct(&structChainIter, &localExtImgCi);
@@ -2178,9 +2145,7 @@ public:
#ifdef VK_USE_PLATFORM_ANDROID_KHR
VkNativeBufferANDROID localAnb;
const VkNativeBufferANDROID* anbInfoPtr =
- vk_find_struct<VkNativeBufferANDROID>(
- pCreateInfo,
- VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID);
+ vk_find_struct<VkNativeBufferANDROID>(pCreateInfo);
if (anbInfoPtr) {
localAnb = vk_make_orphan_copy(*anbInfoPtr);
vk_append_struct(&structChainIter, &localAnb);
@@ -2188,9 +2153,7 @@ public:
VkExternalFormatANDROID localExtFormatAndroid;
const VkExternalFormatANDROID* extFormatAndroidPtr =
- vk_find_struct<VkExternalFormatANDROID>(
- pCreateInfo,
- VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID);
+ vk_find_struct<VkExternalFormatANDROID>(pCreateInfo);
if (extFormatAndroidPtr) {
localExtFormatAndroid = vk_make_orphan_copy(*extFormatAndroidPtr);
@@ -2208,9 +2171,7 @@ public:
#ifdef VK_USE_PLATFORM_FUCHSIA
const VkBufferCollectionImageCreateInfoFUCHSIA* extBufferCollectionPtr =
- vk_find_struct<VkBufferCollectionImageCreateInfoFUCHSIA>(
- pCreateInfo,
- VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA);
+ vk_find_struct<VkBufferCollectionImageCreateInfoFUCHSIA>(pCreateInfo);
if (extBufferCollectionPtr) {
auto collection = reinterpret_cast<fuchsia::sysmem::BufferCollectionSyncPtr*>(
extBufferCollectionPtr->collection);
@@ -2288,9 +2249,7 @@ public:
#ifdef VK_USE_PLATFORM_ANDROID_KHR
const VkExternalFormatANDROID* extFormatAndroidPtr =
- vk_find_struct<VkExternalFormatANDROID>(
- pCreateInfo,
- VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID);
+ vk_find_struct<VkExternalFormatANDROID>(pCreateInfo);
if (extFormatAndroidPtr) {
if (extFormatAndroidPtr->externalFormat) {
localCreateInfo.format =
@@ -2315,9 +2274,7 @@ public:
#ifdef VK_USE_PLATFORM_ANDROID_KHR
const VkExternalFormatANDROID* extFormatAndroidPtr =
- vk_find_struct<VkExternalFormatANDROID>(
- pCreateInfo,
- VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID);
+ vk_find_struct<VkExternalFormatANDROID>(pCreateInfo);
if (extFormatAndroidPtr) {
if (extFormatAndroidPtr->externalFormat) {
localCreateInfo.format =
@@ -2412,8 +2369,7 @@ public:
info.createInfo.pNext = nullptr;
const VkExternalMemoryBufferCreateInfo* extBufCi =
- vk_find_struct<VkExternalMemoryBufferCreateInfo>(pCreateInfo,
- VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO);
+ vk_find_struct<VkExternalMemoryBufferCreateInfo>(pCreateInfo);
if (!extBufCi) return res;
@@ -2504,9 +2460,7 @@ public:
VkSemaphoreCreateInfo finalCreateInfo = *pCreateInfo;
const VkExportSemaphoreCreateInfoKHR* exportSemaphoreInfoPtr =
- vk_find_struct<VkExportSemaphoreCreateInfoKHR>(
- pCreateInfo,
- VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR);
+ vk_find_struct<VkExportSemaphoreCreateInfoKHR>(pCreateInfo);
#ifdef VK_USE_PLATFORM_FUCHSIA
bool exportEvent = exportSemaphoreInfoPtr &&
@@ -3075,9 +3029,7 @@ public:
(void)input_result;
VkAndroidHardwareBufferUsageANDROID* output_ahw_usage =
- vk_find_struct<VkAndroidHardwareBufferUsageANDROID>(
- pImageFormatProperties,
- VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID);
+ vk_find_struct<VkAndroidHardwareBufferUsageANDROID>(pImageFormatProperties);
VkResult hostRes;
diff --git a/system/vulkan_enc/goldfish_vk_private_defs.h b/system/vulkan_enc/goldfish_vk_private_defs.h
index b1e5dcc2..15d30e14 100644
--- a/system/vulkan_enc/goldfish_vk_private_defs.h
+++ b/system/vulkan_enc/goldfish_vk_private_defs.h
@@ -443,6 +443,35 @@ typedef struct VkBufferCollectionImageCreateInfoFUCHSIA {
((VkStructureType)1001004005)
#endif // VK_USE_PLATFORM_FUCHSIA
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+
+typedef struct VkImportMemoryZirconHandleInfoFUCHSIA {
+ VkStructureType sType;
+ const void* pNext;
+ VkExternalMemoryHandleTypeFlagBits handleType;
+ uint32_t handle;
+} VkImportMemoryZirconHandleInfoFUCHSIA;
+
+typedef uint32_t VkBufferCollectionFUCHSIA;
+
+typedef struct VkImportMemoryBufferCollectionFUCHSIA {
+ VkStructureType sType;
+ const void* pNext;
+ VkBufferCollectionFUCHSIA collection;
+ uint32_t index;
+} VkImportMemoryBufferCollectionFUCHSIA;
+
+#define VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA \
+ ((VkStructureType)1001000000)
+#define VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA \
+ ((VkStructureType)1001000000)
+#define VK_EXTERNAL_MEMORY_HANDLE_TYPE_TEMP_ZIRCON_VMO_BIT_FUCHSIA \
+ ((VkStructureType)0x00000800)
+#define VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_TEMP_ZIRCON_EVENT_BIT_FUCHSIA \
+ ((VkStructureType)0x00000020)
+
+#endif // VK_USE_PLATFORM_ANDROID_KHR
+
#ifdef __cplusplus
} // extern "C"
#endif
diff --git a/system/vulkan_enc/vk_struct_id.h b/system/vulkan_enc/vk_struct_id.h
new file mode 100644
index 00000000..c2c9ad90
--- /dev/null
+++ b/system/vulkan_enc/vk_struct_id.h
@@ -0,0 +1,56 @@
+// Copyright (C) 2018 The Android Open Source Project
+// Copyright (C) 2018 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#pragma once
+
+#include <vulkan/vulkan.h>
+#include "goldfish_vk_private_defs.h"
+
+template <class T> struct vk_get_vk_struct_id;
+
+#define REGISTER_VK_STRUCT_ID(T, ID) \
+ template <> struct vk_get_vk_struct_id<T> { static constexpr VkStructureType id = ID; };
+
+REGISTER_VK_STRUCT_ID(VkAndroidHardwareBufferPropertiesANDROID, VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_PROPERTIES_ANDROID);
+REGISTER_VK_STRUCT_ID(VkAndroidHardwareBufferFormatPropertiesANDROID, VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_FORMAT_PROPERTIES_ANDROID);
+REGISTER_VK_STRUCT_ID(VkAndroidHardwareBufferUsageANDROID, VK_STRUCTURE_TYPE_ANDROID_HARDWARE_BUFFER_USAGE_ANDROID);
+REGISTER_VK_STRUCT_ID(VkBufferCreateInfo, VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO);
+REGISTER_VK_STRUCT_ID(VkImageCreateInfo, VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO);
+REGISTER_VK_STRUCT_ID(VkImageFormatProperties2, VK_STRUCTURE_TYPE_IMAGE_FORMAT_PROPERTIES_2);
+REGISTER_VK_STRUCT_ID(VkNativeBufferANDROID, VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID);
+REGISTER_VK_STRUCT_ID(VkExternalFormatANDROID, VK_STRUCTURE_TYPE_EXTERNAL_FORMAT_ANDROID);
+REGISTER_VK_STRUCT_ID(VkExternalMemoryBufferCreateInfo, VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO);
+REGISTER_VK_STRUCT_ID(VkExternalMemoryImageCreateInfo, VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_IMAGE_CREATE_INFO);
+REGISTER_VK_STRUCT_ID(VkMemoryAllocateInfo, VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO);
+REGISTER_VK_STRUCT_ID(VkMemoryDedicatedAllocateInfo, VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO);
+REGISTER_VK_STRUCT_ID(VkMemoryDedicatedRequirements, VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS);
+REGISTER_VK_STRUCT_ID(VkImportAndroidHardwareBufferInfoANDROID, VK_STRUCTURE_TYPE_IMPORT_ANDROID_HARDWARE_BUFFER_INFO_ANDROID);
+REGISTER_VK_STRUCT_ID(VkExportMemoryAllocateInfo, VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO);
+REGISTER_VK_STRUCT_ID(VkMemoryRequirements2, VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2);
+REGISTER_VK_STRUCT_ID(VkSemaphoreCreateInfo, VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO);
+REGISTER_VK_STRUCT_ID(VkExportSemaphoreCreateInfoKHR, VK_STRUCTURE_TYPE_EXPORT_SEMAPHORE_CREATE_INFO_KHR);
+REGISTER_VK_STRUCT_ID(VkSamplerYcbcrConversionCreateInfo, VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO);
+REGISTER_VK_STRUCT_ID(VkImportColorBufferGOOGLE, VK_STRUCTURE_TYPE_IMPORT_COLOR_BUFFER_GOOGLE);
+
+#ifdef VK_USE_PLATFORM_ANDROID_KHR
+// These two should be under Android
+REGISTER_VK_STRUCT_ID(VkImportMemoryBufferCollectionFUCHSIA, VK_STRUCTURE_TYPE_IMPORT_MEMORY_BUFFER_COLLECTION_FUCHSIA);
+REGISTER_VK_STRUCT_ID(VkImportMemoryZirconHandleInfoFUCHSIA, VK_STRUCTURE_TYPE_TEMP_IMPORT_MEMORY_ZIRCON_HANDLE_INFO_FUCHSIA);
+#endif // VK_USE_PLATFORM_ANDROID_KHR
+
+#ifdef VK_USE_PLATFORM_FUCHSIA
+REGISTER_VK_STRUCT_ID(VkBufferCollectionImageCreateInfoFUCHSIA, VK_STRUCTURE_TYPE_BUFFER_COLLECTION_IMAGE_CREATE_INFO_FUCHSIA);
+#endif // VK_USE_PLATFORM_FUCHSIA
+
+#undef REGISTER_VK_STRUCT_ID
diff --git a/system/vulkan_enc/vk_util.h b/system/vulkan_enc/vk_util.h
index 41410d34..39de9918 100644
--- a/system/vulkan_enc/vk_util.h
+++ b/system/vulkan_enc/vk_util.h
@@ -27,6 +27,7 @@
#include <vulkan/vulkan.h>
#include <stdlib.h>
+#include "vk_struct_id.h"
struct vk_struct_common {
VkStructureType sType;
@@ -196,23 +197,17 @@ __vk_find_struct(void *start, VkStructureType sType)
return NULL;
}
-template <class T> void vk_is_vk_struct(T *s)
+template <class T, class H> T* vk_find_struct(H* head)
{
- static_assert(sizeof(s->sType) == sizeof(VkStructureType), "Vulkan structures has the sType field of type VkStructureType");
- static_assert(sizeof(s->pNext) == sizeof(void*), "Vulkan structures has the pNext field of void*");
+ vk_get_vk_struct_id<H>::id;
+ return static_cast<T*>(__vk_find_struct(static_cast<void*>(head), vk_get_vk_struct_id<T>::id));
}
-template <class T, class H> T* vk_find_struct(H* head, VkStructureType sType)
+template <class T, class H> const T* vk_find_struct(const H* head)
{
- vk_is_vk_struct(head);
- return static_cast<T*>(__vk_find_struct(static_cast<void*>(head), sType));
-}
-
-template <class T, class H> const T* vk_find_struct(const H* head, VkStructureType sType)
-{
- vk_is_vk_struct(head);
+ vk_get_vk_struct_id<H>::id;
return static_cast<const T*>(__vk_find_struct(const_cast<void*>(static_cast<const void*>(head)),
- sType));
+ vk_get_vk_struct_id<T>::id));
}
uint32_t vk_get_driver_version(void);
@@ -233,14 +228,14 @@ template <class T> T vk_make_orphan_copy(const T& vk_struct) {
template <class T> vk_struct_chain_iterator vk_make_chain_iterator(T* vk_struct)
{
- vk_is_vk_struct(vk_struct);
+ vk_get_vk_struct_id<T>::id;
vk_struct_chain_iterator result = { reinterpret_cast<vk_struct_common*>(vk_struct) };
return result;
}
template <class T> void vk_append_struct(vk_struct_chain_iterator* i, T* vk_struct)
{
- vk_is_vk_struct(vk_struct);
+ vk_get_vk_struct_id<T>::id;
vk_struct_common* p = i->value;
if (p->pNext) {