Layers: Add KHR/KHX/NN extensions to threading layer
authorMark Lobodzinski <mark@lunarg.com>
Fri, 10 Feb 2017 15:34:54 +0000 (08:34 -0700)
committerMark Lobodzinski <mark@lunarg.com>
Tue, 14 Feb 2017 19:53:41 +0000 (12:53 -0700)
These were skipped due to problems in codegen. Added support for new
objects into the layer, fixed codegen.

Change-Id: Iaf4fcaa229664f7d3118da4db35649fbdf36e2eb

layers/threading.h
scripts/threading_generator.py

index 67bb0d6..acec7cd 100644 (file)
@@ -248,6 +248,10 @@ struct layer_data {
     counter<VkDebugReportCallbackEXT> c_VkDebugReportCallbackEXT;
     counter<VkObjectTableNVX> c_VkObjectTableNVX;
     counter<VkIndirectCommandsLayoutNVX> c_VkIndirectCommandsLayoutNVX;
+    counter<VkDisplayKHR> c_VkDisplayKHR;
+    counter<VkDisplayModeKHR> c_VkDisplayModeKHR;
+    counter<VkSurfaceKHR> c_VkSurfaceKHR;
+    counter<VkSwapchainKHR> c_VkSwapchainKHR;
 #else   // DISTINCT_NONDISPATCHABLE_HANDLES
     counter<uint64_t> c_uint64_t;
 #endif  // DISTINCT_NONDISPATCHABLE_HANDLES
@@ -284,7 +288,11 @@ struct layer_data {
           c_VkShaderModule("VkShaderModule", VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT),
           c_VkDebugReportCallbackEXT("VkDebugReportCallbackEXT", VK_DEBUG_REPORT_OBJECT_TYPE_DEBUG_REPORT_EXT),
           c_VkObjectTableNVX("VkObjectTableNVX", VK_DEBUG_REPORT_OBJECT_TYPE_OBJECT_TABLE_NVX_EXT),
-          c_VkIndirectCommandsLayoutNVX("VkIndirectCommandsLayoutNVX", VK_DEBUG_REPORT_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX_EXT)
+          c_VkIndirectCommandsLayoutNVX("VkIndirectCommandsLayoutNVX", VK_DEBUG_REPORT_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NVX_EXT),
+          c_VkDisplayKHR("VkDisplayKHR", VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_KHR_EXT),
+          c_VkDisplayModeKHR("VkDisplayModeKHR", VK_DEBUG_REPORT_OBJECT_TYPE_DISPLAY_MODE_KHR_EXT),
+          c_VkSurfaceKHR("VkSurfaceKHR", VK_DEBUG_REPORT_OBJECT_TYPE_SURFACE_KHR_EXT),
+          c_VkSwapchainKHR("VkSwapchainKHR", VK_DEBUG_REPORT_OBJECT_TYPE_SWAPCHAIN_KHR_EXT)
 #else   // DISTINCT_NONDISPATCHABLE_HANDLES
           c_uint64_t("NON_DISPATCHABLE_HANDLE", VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT)
 #endif  // DISTINCT_NONDISPATCHABLE_HANDLES
@@ -328,6 +336,10 @@ WRAPPER(VkShaderModule)
 WRAPPER(VkDebugReportCallbackEXT)
 WRAPPER(VkObjectTableNVX)
 WRAPPER(VkIndirectCommandsLayoutNVX)
+WRAPPER(VkDisplayKHR)
+WRAPPER(VkDisplayModeKHR)
+WRAPPER(VkSurfaceKHR)
+WRAPPER(VkSwapchainKHR)
 #else   // DISTINCT_NONDISPATCHABLE_HANDLES
 WRAPPER(uint64_t)
 #endif  // DISTINCT_NONDISPATCHABLE_HANDLES
index 3ce26d2..3385784 100644 (file)
@@ -134,19 +134,13 @@ class ThreadOutputGenerator(OutputGenerator):
     def paramIsPointer(self, param):
         ispointer = False
         for elem in param:
-            #write('paramIsPointer '+elem.text, file=sys.stderr)
-            #write('elem.tag '+elem.tag, file=sys.stderr)
-            #if (elem.tail is None):
-            #    write('elem.tail is None', file=sys.stderr)
-            #else:
-            #    write('elem.tail '+elem.tail, file=sys.stderr)
             if ((elem.tag is not 'type') and (elem.tail is not None)) and '*' in elem.tail:
                 ispointer = True
-            #    write('is pointer', file=sys.stderr)
         return ispointer
     def makeThreadUseBlock(self, cmd, functionprefix):
         """Generate C function pointer typedef for <command> Element"""
         paramdecl = ''
+        # TODO: We should generate these lists
         thread_check_dispatchable_objects = [
             "VkCommandBuffer",
             "VkDevice",
@@ -173,6 +167,12 @@ class ThreadOutputGenerator(OutputGenerator):
             "VkSampler",
             "VkSemaphore",
             "VkShaderModule",
+            "VkObjectTableNVX",
+            "VkIndirectCommandsLayoutNVX",
+            "VkDisplayKHR",
+            "VkDisplayModeKHR",
+            "VkSurfaceKHR",
+            "VkSwapchainKHR",
         ]
 
         # Find and add any parameters that are thread unsafe
@@ -214,6 +214,7 @@ class ThreadOutputGenerator(OutputGenerator):
                         # externsync can list members to synchronize
                         for member in externsync.split(","):
                             member = str(member).replace("::", "->")
+                            member = str(member).replace(".", "->")
                             paramdecl += '    ' + functionprefix + 'WriteObject(my_data, ' + member + ');\n'
                 else:
                     paramtype = param.find('type')
@@ -223,7 +224,13 @@ class ThreadOutputGenerator(OutputGenerator):
                         paramtype = 'None'
                     if paramtype in thread_check_dispatchable_objects or paramtype in thread_check_nondispatchable_objects:
                         if self.paramIsArray(param) and ('pPipelines' != paramname.text):
-                            paramdecl += '    for (uint32_t index=0;index<' + param.attrib.get('len') + ';index++) {\n'
+                            # Add pointer dereference for array counts that are pointer values
+                            dereference = ''
+                            for candidate in params:
+                                if param.attrib.get('len') == candidate.find('name').text:
+                                    if self.paramIsPointer(candidate):
+                                        dereference = '*'
+                            paramdecl += '    for (uint32_t index = 0; index < ' + dereference + param.attrib.get('len') + '; index++) {\n'
                             paramdecl += '        ' + functionprefix + 'ReadObject(my_data, ' + paramname.text + '[index]);\n'
                             paramdecl += '    }\n'
                         elif not self.paramIsPointer(param):
@@ -400,13 +407,7 @@ class ThreadOutputGenerator(OutputGenerator):
             self.appendSection('command', decls[0])
             self.intercepts += [ '    {"%s", reinterpret_cast<PFN_vkVoidFunction>(%s)},' % (name,name[2:]) ]
             return
-        if ("KHR" in name) or ("KHX" in name):
-            self.appendSection('command', '// TODO - not wrapping KHR function ' + name)
-            return
-        if ("NN" in name):
-            self.appendSection('command', '// TODO - not wrapping NN function ' + name)
-            return
-        if ("DebugMarker" in name) and ("EXT" in name):
+        if "QueuePresentKHR" in name or ("DebugMarker" in name and "EXT" in name):
             self.appendSection('command', '// TODO - not wrapping EXT function ' + name)
             return
         # Determine first if this function needs to be intercepted