Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/KhronosGroup/Vulkan-Loader.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobin Ehlis <tobin@lunarg.com>2014-11-26 03:43:26 +0300
committerCourtney Goeltzenleuchter <courtney@LunarG.com>2014-11-26 20:03:12 +0300
commit9e7c78b300a83399eb83b31946bc2c50c185fc50 (patch)
treee35a5e549c3027cf20a47a47b82615c01a6dff2f
parenta3c04222d44520f2d841c814c4c4f4741b0deec4 (diff)
layers: Added APIDumpNoAddr layer that replaces variable addresses in API Dump w/ static "addr" stringkhronos-master-20141209
-rwxr-xr-xxgl-helper.py36
-rwxr-xr-xxgl-layer-generate.py55
2 files changed, 79 insertions, 12 deletions
diff --git a/xgl-helper.py b/xgl-helper.py
index a59446259..d570580e7 100755
--- a/xgl-helper.py
+++ b/xgl-helper.py
@@ -308,6 +308,8 @@ class StructWrapperGen:
self.header_filename = os.path.join(out_dir, self.api+"_struct_wrappers.h")
self.class_filename = os.path.join(out_dir, self.api+"_struct_wrappers.cpp")
self.string_helper_filename = os.path.join(out_dir, self.api+"_struct_string_helper.h")
+ self.string_helper_no_addr_filename = os.path.join(out_dir, self.api+"_struct_string_helper_no_addr.h")
+ self.no_addr = False
self.hfg = CommonFileGen(self.header_filename)
self.cfg = CommonFileGen(self.class_filename)
self.shg = CommonFileGen(self.string_helper_filename)
@@ -318,6 +320,13 @@ class StructWrapperGen:
def set_include_headers(self, include_headers):
self.include_headers = include_headers
+ def set_no_addr(self, no_addr):
+ self.no_addr = no_addr
+ if self.no_addr:
+ self.shg = CommonFileGen(self.string_helper_no_addr_filename)
+ else:
+ self.shg = CommonFileGen(self.string_helper_filename)
+
# Return class name for given struct name
def get_class_name(self, struct_name):
class_name = struct_name.strip('_').lower() + "_struct_wrapper"
@@ -454,7 +463,6 @@ class StructWrapperGen:
elif 'INT' in struct_member['type']:
print_type = "i"
elif struct_member['ptr']:
- #cast_type = ""
pass
else:
#print("Unhandled struct type: %s" % struct_member['type'])
@@ -465,6 +473,9 @@ class StructWrapperGen:
member_post = "[i]"
print_out = "%%s%s%s = %%%s%s" % (member_name, member_print_post, print_type, postfix) # section of print that goes inside of quotes
print_arg = ", %s,%s %s(%s%s%s)%s" % (pre_var_name, array_index, cast_type, struct_var_name, struct_op, member_name, member_post) # section of print passed to portion in quotes
+ if self.no_addr and "p" == print_type:
+ print_out = "%%s%s%s = addr\\n" % (member_name, member_print_post) # section of print that goes inside of quotes
+ print_arg = ", %s" % (pre_var_name)
return (print_out, print_arg)
def _generateStringHelperFunctions(self):
@@ -498,22 +509,34 @@ class StructWrapperGen:
if 'pNext' == stp_list[index]['name']:
sh_funcs.append(' tmpStr = dynamic_display((XGL_VOID*)pStruct->pNext, prefix);\n')
sh_funcs.append(' stp_strs[%i] = (char*)malloc(256+strlen(tmpStr));\n' % index)
- sh_funcs.append(' sprintf(stp_strs[%i], " %%spNext (%%p)\\n%%s", prefix, (void*)pStruct->pNext, tmpStr);\n' % index)
+ if self.no_addr:
+ sh_funcs.append(' sprintf(stp_strs[%i], " %%spNext (addr)\\n%%s", prefix, tmpStr);\n' % index)
+ else:
+ sh_funcs.append(' sprintf(stp_strs[%i], " %%spNext (%%p)\\n%%s", prefix, (void*)pStruct->pNext, tmpStr);\n' % index)
sh_funcs.append(' free(tmpStr);\n')
else:
sh_funcs.append(' tmpStr = %s(pStruct->%s, extra_indent);\n' % (self._get_sh_func_name(stp_list[index]['type']), stp_list[index]['name']))
sh_funcs.append(' stp_strs[%i] = (char*)malloc(256+strlen(tmpStr)+strlen(prefix));\n' % (index))
- sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s (%%p)\\n%%s", prefix, (void*)pStruct->%s, tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name']))
+ if self.no_addr:
+ sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s (addr)\\n%%s", prefix, tmpStr);\n' % (index, stp_list[index]['name']))
+ else:
+ sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s (%%p)\\n%%s", prefix, (void*)pStruct->%s, tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name']))
sh_funcs.append(' }\n')
sh_funcs.append(" else\n stp_strs[%i] = &dummy_char;\n" % (index))
elif stp_list[index]['array']: # TODO : For now just printing first element of array
sh_funcs.append(' tmpStr = %s(&pStruct->%s[0], extra_indent);\n' % (self._get_sh_func_name(stp_list[index]['type']), stp_list[index]['name']))
sh_funcs.append(' stp_strs[%i] = (char*)malloc(256+strlen(tmpStr));\n' % (index))
- sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s[0] (%%p)\\n%%s", prefix, (void*)&pStruct->%s[0], tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name']))
+ if self.no_addr:
+ sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s[0] (addr)\\n%%s", prefix, tmpStr);\n' % (index, stp_list[index]['name']))
+ else:
+ sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s[0] (%%p)\\n%%s", prefix, (void*)&pStruct->%s[0], tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name']))
else:
sh_funcs.append(' tmpStr = %s(&pStruct->%s, extra_indent);\n' % (self._get_sh_func_name(stp_list[index]['type']), stp_list[index]['name']))
sh_funcs.append(' stp_strs[%i] = (char*)malloc(256+strlen(tmpStr));\n' % (index))
- sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s (%%p)\\n%%s", prefix, (void*)&pStruct->%s, tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name']))
+ if self.no_addr:
+ sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s (addr)\\n%%s", prefix, tmpStr);\n' % (index, stp_list[index]['name']))
+ else:
+ sh_funcs.append(' sprintf(stp_strs[%i], " %%s%s (%%p)\\n%%s", prefix, (void*)&pStruct->%s, tmpStr);\n' % (index, stp_list[index]['name'], stp_list[index]['name']))
total_strlen_str += 'strlen(stp_strs[%i]) + ' % index
sh_funcs.append(' str = (char*)malloc(%ssizeof(char)*1024);\n' % (total_strlen_str))
sh_funcs.append(' sprintf(str, "')
@@ -853,6 +876,9 @@ def main(argv=None):
print("Generating struct wrapper class to %s" % sw.class_filename)
sw.generateBody()
sw.generateStringHelper()
+ # Generate a 2nd helper file that excludes addrs
+ sw.set_no_addr(True)
+ sw.generateStringHelper()
if opts.gen_cmake:
cmg = CMakeGen(sw, os.path.dirname(enum_filename))
cmg.generate()
diff --git a/xgl-layer-generate.py b/xgl-layer-generate.py
index a28c6b63a..da820eb9c 100755
--- a/xgl-layer-generate.py
+++ b/xgl-layer-generate.py
@@ -138,11 +138,13 @@ class Subcommand(object):
%s;
};""" % ";\n ".join(entries)
- def _generate_dispatch_entrypoints(self, qual="", layer="Generic"):
+ def _generate_dispatch_entrypoints(self, qual="", layer="Generic", no_addr=False):
if qual:
qual += " "
layer_name = layer
+ if no_addr:
+ layer_name = "%sNoAddr" % layer
funcs = []
for proto in self.protos:
if proto.name != "GetProcAddr" and proto.name != "InitAndEnumerateGpus":
@@ -175,7 +177,7 @@ class Subcommand(object):
' strncpy(pOutLayers[0], "%s", maxStringSize);\n'
' return XGL_SUCCESS;\n'
' }\n'
- '}' % (qual, decl, proto.params[0].name, proto.name, ret_val, c_call, proto.name, stmt, layer))
+ '}' % (qual, decl, proto.params[0].name, proto.name, ret_val, c_call, proto.name, stmt, layer_name))
elif proto.params[0].ty != "XGL_PHYSICAL_GPU":
funcs.append('%s%s\n'
'{\n'
@@ -233,6 +235,8 @@ class Subcommand(object):
if p.name == proto.params[y].name:
cp = True
(pft, pfi) = self._get_printf_params(p.ty, p.name, cp)
+ if no_addr and "%p" == pft:
+ (pft, pfi) = ("%s", '"addr"')
log_func += '%s = %s, ' % (p.name, pft)
print_vals += ', %s' % (pfi)
# TODO : Just want this to be simple check for params of STRUCT type
@@ -253,10 +257,16 @@ class Subcommand(object):
cis_print_func = 'xgl_print_%s' % (proto.params[sp_index].ty.strip('const ').strip('*').lower())
log_func += '\n if (%s) {' % (proto.params[sp_index].name)
log_func += '\n pTmpStr = %s(%s, " ");' % (cis_print_func, proto.params[sp_index].name)
- if "file" in layer:
- log_func += '\n fprintf(pOutFile, " %s (%%p)\\n%%s\\n", (void*)%s, pTmpStr);' % (proto.params[sp_index].name, proto.params[sp_index].name)
+ if "File" in layer:
+ if no_addr:
+ log_func += '\n fprintf(pOutFile, " %s (addr)\\n%%s\\n", pTmpStr);' % (proto.params[sp_index].name)
+ else:
+ log_func += '\n fprintf(pOutFile, " %s (%%p)\\n%%s\\n", (void*)%s, pTmpStr);' % (proto.params[sp_index].name, proto.params[sp_index].name)
else:
- log_func += '\n printf(" %s (%%p)\\n%%s\\n", (void*)%s, pTmpStr);' % (proto.params[sp_index].name, proto.params[sp_index].name)
+ if no_addr:
+ log_func += '\n printf(" %s (addr)\\n%%s\\n", pTmpStr);' % (proto.params[sp_index].name)
+ else:
+ log_func += '\n printf(" %s (%%p)\\n%%s\\n", (void*)%s, pTmpStr);' % (proto.params[sp_index].name, proto.params[sp_index].name)
log_func += '\n fflush(stdout);'
log_func += '\n free(pTmpStr);\n }'
if proto.name == "EnumerateLayers":
@@ -278,7 +288,7 @@ class Subcommand(object):
' strncpy(pOutLayers[0], "%s", maxStringSize);\n'
' return XGL_SUCCESS;\n'
' }\n'
- '}' % (qual, decl, proto.params[0].name, ret_val, c_call,f_open, log_func, f_close, stmt, layer))
+ '}' % (qual, decl, proto.params[0].name, ret_val, c_call,f_open, log_func, f_close, stmt, layer_name))
elif proto.params[0].ty != "XGL_PHYSICAL_GPU":
funcs.append('%s%s\n'
'{\n'
@@ -384,7 +394,7 @@ class Subcommand(object):
' strncpy(pOutLayers[0], "%s", maxStringSize);\n'
' return XGL_SUCCESS;\n'
' }\n'
- '}' % (qual, decl, proto.params[0].name, using_line, ret_val, c_call, create_line, destroy_line, stmt, layer))
+ '}' % (qual, decl, proto.params[0].name, using_line, ret_val, c_call, create_line, destroy_line, stmt, layer_name))
elif proto.params[0].ty != "XGL_PHYSICAL_GPU":
funcs.append('%s%s\n'
'{\n'
@@ -584,6 +594,36 @@ class ApiDumpFileSubcommand(Subcommand):
return "\n\n".join(body)
+class ApiDumpNoAddrSubcommand(Subcommand):
+ def generate_header(self):
+ header_txt = []
+ header_txt.append('#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <assert.h>\n#include <pthread.h>\n#include "xglLayer.h"\n#include "xgl_struct_string_helper_no_addr.h"\n\nstatic XGL_LAYER_DISPATCH_TABLE nextTable;\nstatic XGL_BASE_LAYER_OBJECT *pCurObj;\nstatic pthread_once_t tabOnce = PTHREAD_ONCE_INIT;\npthread_mutex_t print_lock = PTHREAD_MUTEX_INITIALIZER;\n')
+ header_txt.append('#define MAX_TID 513')
+ header_txt.append('static pthread_t tidMapping[MAX_TID] = {0};')
+ header_txt.append('static uint32_t maxTID = 0;')
+ header_txt.append('// Map actual TID to an index value and return that index')
+ header_txt.append('// This keeps TIDs in range from 0-MAX_TID and simplifies compares between runs')
+ header_txt.append('static uint32_t getTIDIndex() {')
+ header_txt.append(' pthread_t tid = pthread_self();')
+ header_txt.append(' for (uint32_t i = 0; i < maxTID; i++) {')
+ header_txt.append(' if (tid == tidMapping[i])')
+ header_txt.append(' return i;')
+ header_txt.append(' }')
+ header_txt.append(" // Don't yet have mapping, set it and return newly set index")
+ header_txt.append(' uint32_t retVal = (uint32_t)maxTID;')
+ header_txt.append(' tidMapping[maxTID++] = tid;')
+ header_txt.append(' assert(maxTID < MAX_TID);')
+ header_txt.append(' return retVal;')
+ header_txt.append('}')
+ return "\n".join(header_txt)
+
+ def generate_body(self):
+ body = [self._generate_layer_dispatch_table(),
+ self._generate_dispatch_entrypoints("XGL_LAYER_EXPORT", "APIDump", True),
+ self._generate_layer_gpa_function()]
+
+ return "\n\n".join(body)
+
class ObjectTrackerSubcommand(Subcommand):
def generate_header(self):
header_txt = []
@@ -792,6 +832,7 @@ def main():
"Generic" : GenericLayerSubcommand,
"ApiDump" : ApiDumpSubcommand,
"ApiDumpFile" : ApiDumpFileSubcommand,
+ "ApiDumpNoAddr" : ApiDumpNoAddrSubcommand,
"ObjectTracker" : ObjectTrackerSubcommand,
}