layers: use class attributes in code generation
Move layer_name from parameters to class attribute.
Move no_addr setting from parameters to class attribute.
Access generate_intercept method through class instead of parameter.
diff --git a/xgl-layer-generate.py b/xgl-layer-generate.py
index 85edaf9..f16ef7f 100755
--- a/xgl-layer-generate.py
+++ b/xgl-layer-generate.py
@@ -40,6 +40,8 @@
self.argv = argv
self.headers = xgl.headers
self.protos = xgl.protos
+ self.no_addr = False
+ self.layer_name = ""
def run(self):
print(self.generate())
@@ -192,15 +194,10 @@
ur_body.append('}')
return "\n".join(ur_body)
- def _generate_dispatch_entrypoints(self, qual="", layer="Generic", no_addr=False):
+ def _generate_dispatch_entrypoints(self, qual="", layer="Generic"):
if qual:
qual += " "
- layer_name = layer
- if no_addr:
- layer_name = "%sNoAddr" % layer
- if 'Cpp' in layer_name:
- layer_name = "APIDumpNoAddrCpp"
funcs = []
for proto in self.protos:
if proto.name != "GetProcAddr" and proto.name != "InitAndEnumerateGpus":
@@ -241,7 +238,7 @@
if p.name == proto.params[y].name:
cp = True
(pft, pfi) = self._get_printf_params(p.ty, p.name, cp, cpp=True)
- if no_addr and "%p" == pft:
+ if self.no_addr and "%p" == pft:
(pft, pfi) = ("%s", '"addr"')
log_func += '%s = " << %s << ", ' % (p.name, pfi)
#print_vals += ', %s' % (pfi)
@@ -279,12 +276,12 @@
var_name = '&%s' % (proto.params[sp_index].name)
log_func += '\n tmp_str = %s(%s, " ");' % (cis_print_func, var_name)
if "File" in layer:
- if no_addr:
+ if self.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, var_name)
else:
- if no_addr:
+ if self.no_addr:
#log_func += '\n printf(" %s (addr)\\n%%s\\n", pTmpStr);' % (proto.params[sp_index].name)
log_func += '\n cout << " %s (addr)" << endl << tmp_str << endl;' % (proto.params[sp_index].name)
else:
@@ -314,12 +311,12 @@
log_func += '\n for (i = 0; i < %s; i++) {' % (sp_param_dict[sp_index])
log_func += '\n %s' % (cis_print_func)
if "File" in layer:
- if no_addr:
+ if self.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:
- if no_addr:
+ if self.no_addr:
#log_func += '\n printf(" %s (addr)\\n%%s\\n", pTmpStr);' % (proto.params[sp_index].name)
log_func += '\n cout << " %s[" << (uint32_t)i << "] (addr)" << endl << tmp_str << endl;' % (proto.params[sp_index].name)
else:
@@ -349,7 +346,7 @@
' strncpy((char *) pOutLayers[0], "%s", maxStringSize);\n'
' return XGL_SUCCESS;\n'
' }\n'
- '}' % (qual, decl, proto.params[0].name, layer_name, ret_val, c_call,f_open, log_func, f_close, stmt, layer_name))
+ '}' % (qual, decl, proto.params[0].name, self.layer_name, ret_val, c_call,f_open, log_func, f_close, stmt, self.layer_name))
elif proto.params[0].ty != "XGL_PHYSICAL_GPU":
funcs.append('%s%s\n'
'{\n'
@@ -367,7 +364,7 @@
' %snextTable.%s;\n'
' %s%s%s\n'
'%s'
- '}' % (qual, decl, proto.params[0].name, layer_name, ret_val, c_call, f_open, log_func, f_close, stmt))
+ '}' % (qual, decl, proto.params[0].name, self.layer_name, ret_val, c_call, f_open, log_func, f_close, stmt))
if 'WsiX11QueuePresent' == proto.name:
funcs.append("#endif")
elif "APIDump" in layer:
@@ -408,7 +405,7 @@
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:
+ if self.no_addr and "%p" == pft:
(pft, pfi) = ("%s", '"addr"')
log_func += '%s = %s, ' % (p.name, pft)
print_vals += ', %s' % (pfi)
@@ -448,12 +445,12 @@
var_name = "&%s" % proto.params[sp_index].name
log_func += '\n pTmpStr = %s(%s, " ");' % (cis_print_func, var_name)
if "File" in layer:
- if no_addr:
+ if self.no_addr:
log_func += '\n fprintf(pOutFile, " %s (addr)\\n%%s\\n", pTmpStr);' % (var_name)
else:
log_func += '\n fprintf(pOutFile, " %s (%%p)\\n%%s\\n", (void*)%s, pTmpStr);' % (var_name, var_name)
else:
- if no_addr:
+ if self.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, var_name)
@@ -472,12 +469,12 @@
log_func += '\n for (i = 0; i < %s; i++) {' % (sp_param_dict[sp_index])
log_func += '\n %s' % (cis_print_func)
if "File" in layer:
- if no_addr:
+ if self.no_addr:
log_func += '\n fprintf(pOutFile, " %s[%%i] (addr)\\n%%s\\n", i, pTmpStr);' % (proto.params[sp_index].name)
else:
log_func += '\n fprintf(pOutFile, " %s[%%i] (%%p)\\n%%s\\n", i, (void*)%s, pTmpStr);' % (proto.params[sp_index].name, proto.params[sp_index].name)
else:
- if no_addr:
+ if self.no_addr:
log_func += '\n printf(" %s[%%i] (addr)\\n%%s\\n", i, pTmpStr);' % (proto.params[sp_index].name)
else:
log_func += '\n printf(" %s[%%i] (%%p)\\n%%s\\n", i, (void*)%s, pTmpStr);' % (proto.params[sp_index].name, proto.params[sp_index].name)
@@ -504,7 +501,7 @@
' strncpy((char *) pOutLayers[0], "%s", maxStringSize);\n'
' return XGL_SUCCESS;\n'
' }\n'
- '}' % (qual, decl, proto.params[0].name, layer_name, ret_val, c_call,f_open, log_func, f_close, stmt, layer_name))
+ '}' % (qual, decl, proto.params[0].name, self.layer_name, ret_val, c_call,f_open, log_func, f_close, stmt, self.layer_name))
elif proto.params[0].ty != "XGL_PHYSICAL_GPU":
funcs.append('%s%s\n'
'{\n'
@@ -522,26 +519,21 @@
' %snextTable.%s;\n'
' %s%s%s\n'
'%s'
- '}' % (qual, decl, proto.params[0].name, layer_name, ret_val, c_call, f_open, log_func, f_close, stmt))
+ '}' % (qual, decl, proto.params[0].name, self.layer_name, ret_val, c_call, f_open, log_func, f_close, stmt))
if 'WsiX11QueuePresent' == proto.name:
funcs.append("#endif")
return "\n\n".join(funcs)
- def _generate_dispatch_entrypoints_with_func(self, intercept_func, qual="", layer="Generic", no_addr=False):
+ def _generate_dispatch_entrypoints_with_func(self, qual=""):
if qual:
qual += " "
- layer_name = layer
- if no_addr:
- layer_name = "%sNoAddr" % layer
- if 'Cpp' in layer_name:
- layer_name = "APIDumpNoAddrCpp"
funcs = []
intercepted = []
for proto in self.protos:
if proto.name != "GetProcAddr" and proto.name != "InitAndEnumerateGpus":
- intercept = intercept_func(proto, qual, layer_name, no_addr)
+ intercept = self.generate_intercept(proto, qual)
if intercept is None:
# fill in default intercept for certain entrypoints
if 'DbgRegisterMsgCallback' == proto.name:
@@ -614,7 +606,7 @@
return "\n".join(exts)
- def _generate_layer_gpa_function(self, layer, extensions=[], no_header=False):
+ def _generate_layer_gpa_function(self, extensions=[], no_header=False):
if no_header:
func_body = []
else:
@@ -629,7 +621,7 @@
" loader_platform_thread_once(&tabOnce, init%s);\n\n"
" addr = layer_intercept_proc(funcName);\n"
" if (addr)\n"
- " return addr;" % layer)
+ " return addr;" % self.layer_name)
if 0 != len(extensions):
for ext_name in extensions:
@@ -643,19 +635,19 @@
"}\n")
return "\n".join(func_body)
- def _generate_layer_initialization(self, name, init_opts=False, prefix='xgl', lockname=None):
+ def _generate_layer_initialization(self, init_opts=False, prefix='xgl', lockname=None):
func_body = ["#include \"xgl_dispatch_table_helper.h\""]
func_body.append('static void init%s(void)\n'
- '{\n' % name)
+ '{\n' % self.layer_name)
if init_opts:
func_body.append(' const char *strOpt;')
- func_body.append(' // initialize %s options' % name)
- func_body.append(' getLayerOptionEnum("%sReportLevel", (uint32_t *) &g_reportingLevel);' % name)
- func_body.append(' g_actionIsDefault = getLayerOptionEnum("%sDebugAction", (uint32_t *) &g_debugAction);' % name)
+ func_body.append(' // initialize %s options' % self.layer_name)
+ func_body.append(' getLayerOptionEnum("%sReportLevel", (uint32_t *) &g_reportingLevel);' % self.layer_name)
+ func_body.append(' g_actionIsDefault = getLayerOptionEnum("%sDebugAction", (uint32_t *) &g_debugAction);' % self.layer_name)
func_body.append('')
func_body.append(' if (g_debugAction & XGL_DBG_LAYER_ACTION_LOG_MSG)')
func_body.append(' {')
- func_body.append(' strOpt = getLayerOption("%sLogFilename");' % name)
+ func_body.append(' strOpt = getLayerOption("%sLogFilename");' % self.layer_name)
func_body.append(' if (strOpt)')
func_body.append(' {')
func_body.append(' g_logFile = fopen(strOpt, "w");')
@@ -679,13 +671,13 @@
func_body.append("}\n")
return "\n".join(func_body)
- def _generate_layer_initialization_with_lock(self, layer, prefix='xgl'):
+ def _generate_layer_initialization_with_lock(self, prefix='xgl'):
func_body = ["#include \"xgl_dispatch_table_helper.h\""]
func_body.append('static void init%s(void)\n'
'{\n'
' xglGetProcAddrType fpNextGPA;\n'
' fpNextGPA = pCurObj->pGPA;\n'
- ' assert(fpNextGPA);\n' % layer);
+ ' assert(fpNextGPA);\n' % self.layer_name);
func_body.append(" layer_initialize_dispatch_table(&nextTable, fpNextGPA, (XGL_PHYSICAL_GPU) pCurObj->nextObject);\n")
func_body.append(" if (!printLockInitialized)")
@@ -702,7 +694,7 @@
return '#include <xglLayer.h>\n#include "loader.h"'
def generate_body(self):
- return self._generate_dispatch_entrypoints("static", True)
+ return self._generate_dispatch_entrypoints("static")
class LayerDispatchSubcommand(Subcommand):
def generate_header(self):
@@ -715,7 +707,7 @@
def generate_header(self):
return '#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include "loader_platform.h"\n#include "xglLayer.h"\n//The following is #included again to catch certain OS-specific functions being used:\n#include "loader_platform.h"\n\n#include "layers_config.h"\n#include "layers_msg.h"\n\nstatic XGL_LAYER_DISPATCH_TABLE nextTable;\nstatic XGL_BASE_LAYER_OBJECT *pCurObj;\n\nstatic LOADER_PLATFORM_THREAD_ONCE_DECLARATION(tabOnce);'
- def generate_intercept(self, proto, qual, layer_name, no_addr):
+ def generate_intercept(self, proto, qual):
if proto.name in [ 'DbgRegisterMsgCallback', 'DbgUnregisterMsgCallback' ]:
# use default version
return None
@@ -753,7 +745,7 @@
' strncpy((char *) pOutLayers[0], "%s", maxStringSize);\n'
' return XGL_SUCCESS;\n'
' }\n'
- '}' % (qual, decl, proto.params[0].name, proto.name, layer_name, ret_val, c_call, proto.name, stmt, layer_name))
+ '}' % (qual, decl, proto.params[0].name, proto.name, self.layer_name, ret_val, c_call, proto.name, stmt, self.layer_name))
elif proto.params[0].ty != "XGL_PHYSICAL_GPU":
funcs.append('%s%s\n'
'{\n'
@@ -775,15 +767,16 @@
' layerCbMsg(XGL_DBG_MSG_UNKNOWN, XGL_VALIDATION_LEVEL_0, gpuw, 0, 0, (char *) "GENERIC", (char *) str);\n'
' fflush(stdout);\n'
'%s'
- '}' % (qual, decl, proto.params[0].name, proto.name, layer_name, ret_val, c_call, proto.name, stmt))
+ '}' % (qual, decl, proto.params[0].name, proto.name, self.layer_name, ret_val, c_call, proto.name, stmt))
if 'WsiX11QueuePresent' == proto.name:
funcs.append("#endif")
return "\n\n".join(funcs)
def generate_body(self):
- body = [self._generate_layer_initialization("Generic", True),
- self._generate_dispatch_entrypoints_with_func(self.generate_intercept, "XGL_LAYER_EXPORT", "Generic"),
- self._generate_layer_gpa_function("Generic", no_header=True)]
+ self.layer_name = "Generic"
+ body = [self._generate_layer_initialization(True),
+ self._generate_dispatch_entrypoints_with_func("XGL_LAYER_EXPORT"),
+ self._generate_layer_gpa_function(no_header=True)]
return "\n\n".join(body)
@@ -820,9 +813,10 @@
return "\n".join(header_txt)
def generate_body(self):
- body = [self._generate_layer_initialization_with_lock("APIDump"),
+ self.layer_name = "APIDump"
+ body = [self._generate_layer_initialization_with_lock(),
self._generate_dispatch_entrypoints("XGL_LAYER_EXPORT", "APIDump"),
- self._generate_layer_gpa_function("APIDump")]
+ self._generate_layer_gpa_function()]
return "\n\n".join(body)
@@ -859,9 +853,10 @@
return "\n".join(header_txt)
def generate_body(self):
- body = [self._generate_layer_initialization_with_lock("APIDumpCpp"),
+ self.layer_name = "APIDumpCpp"
+ body = [self._generate_layer_initialization_with_lock(),
self._generate_dispatch_entrypoints("XGL_LAYER_EXPORT", "APIDumpCpp"),
- self._generate_layer_gpa_function("APIDumpCpp")]
+ self._generate_layer_gpa_function()]
return "\n\n".join(body)
@@ -899,9 +894,10 @@
return "\n".join(header_txt)
def generate_body(self):
- body = [self._generate_layer_initialization_with_lock("APIDumpFile"),
+ self.layer_name = "APIDumpFile"
+ body = [self._generate_layer_initialization_with_lock(),
self._generate_dispatch_entrypoints("XGL_LAYER_EXPORT", "APIDumpFile"),
- self._generate_layer_gpa_function("APIDumpFile")]
+ self._generate_layer_gpa_function()]
return "\n\n".join(body)
@@ -938,9 +934,11 @@
return "\n".join(header_txt)
def generate_body(self):
- body = [self._generate_layer_initialization_with_lock("APIDumpNoAddr"),
- self._generate_dispatch_entrypoints("XGL_LAYER_EXPORT", "APIDump", True),
- self._generate_layer_gpa_function("APIDumpNoAddr")]
+ self.layer_name = "APIDumpNoAddr"
+ self.no_addr = True
+ body = [self._generate_layer_initialization_with_lock(),
+ self._generate_dispatch_entrypoints("XGL_LAYER_EXPORT", "APIDump"),
+ self._generate_layer_gpa_function()]
return "\n\n".join(body)
@@ -977,9 +975,11 @@
return "\n".join(header_txt)
def generate_body(self):
- body = [self._generate_layer_initialization_with_lock("APIDumpNoAddrCpp"),
- self._generate_dispatch_entrypoints("XGL_LAYER_EXPORT", "APIDumpCpp", True),
- self._generate_layer_gpa_function("APIDumpNoAddrCpp")]
+ self.layer_name = "APIDumpNoAddrCpp"
+ self.no_addr = True
+ body = [self._generate_layer_initialization_with_lock(),
+ self._generate_dispatch_entrypoints("XGL_LAYER_EXPORT", "APIDumpCpp"),
+ self._generate_layer_gpa_function()]
return "\n\n".join(body)
@@ -1271,7 +1271,7 @@
header_txt.append('}')
return "\n".join(header_txt)
- def generate_intercept(self, proto, qual, layer_name, no_addr):
+ def generate_intercept(self, proto, qual):
if proto.name in [ 'DbgRegisterMsgCallback', 'DbgUnregisterMsgCallback' ]:
# use default version
return None
@@ -1380,7 +1380,7 @@
' strncpy((char *) pOutLayers[0], "%s", maxStringSize);\n'
' return XGL_SUCCESS;\n'
' }\n'
- '}' % (qual, decl, proto.params[0].name, using_line, layer_name, ret_val, c_call, create_line, destroy_line, stmt, layer_name))
+ '}' % (qual, decl, proto.params[0].name, using_line, self.layer_name, ret_val, c_call, create_line, destroy_line, stmt, self.layer_name))
elif proto.params[0].ty != "XGL_PHYSICAL_GPU":
funcs.append('%s%s\n'
'{\n'
@@ -1408,16 +1408,17 @@
'%s%s'
'%s'
'%s'
- '}' % (qual, decl, proto.params[0].name, using_line, layer_name, ret_val, c_call, create_line, destroy_line, gpu_state, stmt))
+ '}' % (qual, decl, proto.params[0].name, using_line, self.layer_name, ret_val, c_call, create_line, destroy_line, gpu_state, stmt))
if 'WsiX11QueuePresent' == proto.name:
funcs.append("#endif")
return "\n\n".join(funcs)
def generate_body(self):
- body = [self._generate_layer_initialization("ObjectTracker", True, lockname='obj'),
- self._generate_dispatch_entrypoints_with_func(self.generate_intercept, "XGL_LAYER_EXPORT", "ObjectTracker"),
+ self.layer_name = "ObjectTracker"
+ body = [self._generate_layer_initialization(True, lockname='obj'),
+ self._generate_dispatch_entrypoints_with_func("XGL_LAYER_EXPORT"),
self._generate_extensions(),
- self._generate_layer_gpa_function("ObjectTracker", extensions=['objTrackGetObjectCount', 'objTrackGetObjects'], no_header=True)]
+ self._generate_layer_gpa_function(extensions=['objTrackGetObjectCount', 'objTrackGetObjects'], no_header=True)]
return "\n\n".join(body)