aboutsummaryrefslogtreecommitdiff
path: root/layers
diff options
context:
space:
mode:
authorDavid Pinedo <david@lunarg.com>2015-06-19 13:48:18 -0600
committerDavid Pinedo <david@lunarg.com>2015-06-19 13:50:33 -0600
commit790ac70cc96699b4244957a00f6a3bb1d27f2c8e (patch)
tree42caf117bbd44f17b46a2c09e32fc51cdc141cfd /layers
parent6ea8d594bf8adec7088a05e07bc391522c11bdbf (diff)
downloadusermoji-790ac70cc96699b4244957a00f6a3bb1d27f2c8e.tar.xz
Layers: Correctly handle WSI_LUNARG extension.
Other code cleanup.
Diffstat (limited to 'layers')
-rw-r--r--layers/screenshot.cpp68
1 files changed, 45 insertions, 23 deletions
diff --git a/layers/screenshot.cpp b/layers/screenshot.cpp
index b59296eb..82c8d79b 100644
--- a/layers/screenshot.cpp
+++ b/layers/screenshot.cpp
@@ -46,6 +46,11 @@ using namespace std;
#include "loader_platform.h"
#include "layers_table.h"
+
+struct devExts {
+ bool wsi_lunarg_enabled;
+};
+static std::unordered_map<void *, struct devExts> deviceExtMap;
static device_table_map screenshot_device_table_map;
static instance_table_map screenshot_instance_table_map;
@@ -87,11 +92,6 @@ static bool screenshotEnvQueried = false;
static void init_screenshot()
{
- uint32_t report_flags = 0;
- uint32_t debug_action = 0;
- FILE *log_output = NULL;
- const char *option_str;
-
if (!globalLockInitialized)
{
// TODO/TBD: Need to delete this mutex sometime. How??? One
@@ -289,15 +289,29 @@ VkResult VKAPI vkCreateInstance(
return result;
}
+static void createDeviceRegisterExtensions(const VkDeviceCreateInfo* pCreateInfo, VkDevice device)
+{
+ uint32_t i, ext_idx;
+ VkLayerDispatchTable *pDisp = get_dispatch_table(screenshot_device_table_map, device);
+ deviceExtMap[pDisp].wsi_lunarg_enabled = false;
+ for (i = 0; i < pCreateInfo->extensionCount; i++) {
+ if (strcmp(pCreateInfo->pEnabledExtensions[i].name, VK_WSI_LUNARG_EXTENSION_NAME) == 0)
+ deviceExtMap[pDisp].wsi_lunarg_enabled = true;
+ }
+}
+
VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(
VkPhysicalDevice gpu,
const VkDeviceCreateInfo *pCreateInfo,
VkDevice *pDevice)
{
-
VkLayerInstanceDispatchTable *pInstanceTable = get_dispatch_table(screenshot_instance_table_map, gpu);
VkResult result = pInstanceTable->CreateDevice(gpu, pCreateInfo, pDevice);
+ if (result == VK_SUCCESS) {
+ createDeviceRegisterExtensions(pCreateInfo, *pDevice);
+ }
+
if (screenshotEnvQueried && screenshotFrames.empty())
// We are all done taking screenshots, so don't do anything else
return result;
@@ -310,18 +324,21 @@ VK_LAYER_EXPORT VkResult VKAPI vkCreateDevice(
return result;
}
-struct extProps {
- uint32_t version;
- const char * const name;
-};
-#define SCREENSHOT_LAYER_EXT_ARRAY_SIZE 1
-static const VkExtensionProperties mtExts[SCREENSHOT_LAYER_EXT_ARRAY_SIZE] = {
+#define SCREENSHOT_LAYER_EXT_ARRAY_SIZE 2
+static const VkExtensionProperties ssExts[SCREENSHOT_LAYER_EXT_ARRAY_SIZE] = {
{
VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
"ScreenShot",
0x10,
"Layer: ScreenShot",
},
+ {
+ VK_STRUCTURE_TYPE_EXTENSION_PROPERTIES,
+ VK_WSI_LUNARG_EXTENSION_NAME,
+ 0x10,
+ "Layer: Screenshot",
+ }
+
};
VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo(
@@ -354,7 +371,7 @@ VK_LAYER_EXPORT VkResult VKAPI vkGetGlobalExtensionInfo(
if (extensionIndex >= SCREENSHOT_LAYER_EXT_ARRAY_SIZE) {
return VK_ERROR_INVALID_VALUE;
}
- memcpy((VkExtensionProperties *) pData, &mtExts[extensionIndex], sizeof(VkExtensionProperties));
+ memcpy((VkExtensionProperties *) pData, &ssExts[extensionIndex], sizeof(VkExtensionProperties));
break;
default:
return VK_ERROR_INVALID_VALUE;
@@ -393,7 +410,7 @@ VK_LAYER_EXPORT VkResult VKAPI vkGetPhysicalDeviceExtensionInfo(
if (extensionIndex >= SCREENSHOT_LAYER_EXT_ARRAY_SIZE) {
return VK_ERROR_INVALID_VALUE;
}
- memcpy((VkExtensionProperties *) pData, &mtExts[extensionIndex], sizeof(VkExtensionProperties));
+ memcpy((VkExtensionProperties *) pData, &ssExts[extensionIndex], sizeof(VkExtensionProperties));
break;
default:
return VK_ERROR_INVALID_VALUE;
@@ -593,16 +610,21 @@ VK_LAYER_EXPORT void* VKAPI vkGetDeviceProcAddr(
}
if (!strcmp(funcName, "vkGetDeviceQueue"))
return (void*) vkGetDeviceQueue;
- if (!strcmp(funcName, "vkCreateSwapChainWSI"))
- return (void*) vkCreateSwapChainWSI;
- if (!strcmp(funcName, "vkGetSwapChainInfoWSI"))
- return (void*) vkGetSwapChainInfoWSI;
- if (!strcmp(funcName, "vkQueuePresentWSI"))
- return (void*) vkQueuePresentWSI;
-
- if (get_dispatch_table(screenshot_device_table_map, dev)->GetDeviceProcAddr == NULL)
+
+ VkLayerDispatchTable *pDisp = get_dispatch_table(screenshot_device_table_map, dev);
+ if (deviceExtMap.size() == 0 || deviceExtMap[pDisp].wsi_lunarg_enabled)
+ {
+ if (!strcmp(funcName, "vkCreateSwapChainWSI"))
+ return (void*) vkCreateSwapChainWSI;
+ if (!strcmp(funcName, "vkGetSwapChainInfoWSI"))
+ return (void*) vkGetSwapChainInfoWSI;
+ if (!strcmp(funcName, "vkQueuePresentWSI"))
+ return (void*) vkQueuePresentWSI;
+ }
+
+ if (pDisp->GetDeviceProcAddr == NULL)
return NULL;
- return get_dispatch_table(screenshot_device_table_map, dev)->GetDeviceProcAddr(dev, funcName);
+ return pDisp->GetDeviceProcAddr(dev, funcName);
}
VK_LAYER_EXPORT void* VKAPI vkGetInstanceProcAddr(