aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Lobodzinski <mark@lunarg.com>2015-02-09 10:20:53 -0600
committerMark Lobodzinski <mark@lunarg.com>2015-02-09 12:28:24 -0600
commitb386d0581cbce1f114cbf7384bdedb9d0652bbf0 (patch)
tree451276044fb23c69282d6b45d2b4f26e10776948
parent32f72984aa9333e5ebedcc309f7e9aa3aacc6b35 (diff)
downloadusermoji-b386d0581cbce1f114cbf7384bdedb9d0652bbf0.tar.xz
layers: Validate mem ref counts in queueSubmit call
Grab and save max from GetGpuInfo, use this to validate count in QueueSubmit call, warn if GetGpuInfo wasn't called beforehand.
-rw-r--r--layers/object_track.h4
-rwxr-xr-xxgl-layer-generate.py30
2 files changed, 33 insertions, 1 deletions
diff --git a/layers/object_track.h b/layers/object_track.h
index b64e634f..0ab7d448 100644
--- a/layers/object_track.h
+++ b/layers/object_track.h
@@ -39,6 +39,8 @@ typedef enum _OBJECT_TRACK_ERROR
OBJTRACK_COLOR_BLEND_NOT_BOUND, // Draw submitted with no color blend state object bound
OBJTRACK_DEPTH_STENCIL_NOT_BOUND, // Draw submitted with no depth-stencil state object bound
OBJTRACK_GPU_MEM_MAPPED, // Mem object ref'd in cmd buff is still mapped
+ OBJTRACK_GETGPUINFO_NOT_CALLED, // Gpu Information has not been requested before drawing
+ OBJTRACK_MEMREFCOUNT_MAX_EXCEEDED, // Number of QueueSubmit memory references exceeds GPU maximum
} OBJECT_TRACK_ERROR;
// Object Status -- used to track state of individual objects
@@ -163,9 +165,11 @@ typedef struct _OBJTRACK_NODE {
uint64_t numUses;
OBJECT_STATUS status;
} OBJTRACK_NODE;
+
// prototype for extension functions
uint64_t objTrackGetObjectCount(XGL_OBJECT_TYPE type);
XGL_RESULT objTrackGetObjects(XGL_OBJECT_TYPE type, uint64_t objCount, OBJTRACK_NODE* pObjNodeArray);
+
// Func ptr typedefs
typedef uint64_t (*OBJ_TRACK_GET_OBJECT_COUNT)(XGL_OBJECT_TYPE);
typedef XGL_RESULT (*OBJ_TRACK_GET_OBJECTS)(XGL_OBJECT_TYPE, uint64_t, OBJTRACK_NODE*);
diff --git a/xgl-layer-generate.py b/xgl-layer-generate.py
index fd236357..bf17f682 100755
--- a/xgl-layer-generate.py
+++ b/xgl-layer-generate.py
@@ -641,6 +641,7 @@ class Subcommand(object):
if 'QueueSubmit' in proto.name:
using_line += ' set_status((void*)fence, XGL_OBJECT_TYPE_FENCE, OBJSTATUS_FENCE_IS_SUBMITTED);\n'
using_line += ' validate_memory_mapping_status(pMemRefs, memRefCount);\n'
+ using_line += ' validate_mem_ref_count(memRefCount);\n'
elif 'GetFenceStatus' in proto.name:
using_line += ' // Warn if submitted_flag is not set\n'
using_line += ' validate_status((void*)fence, XGL_OBJECT_TYPE_FENCE, OBJSTATUS_FENCE_IS_SUBMITTED, OBJSTATUS_FENCE_IS_SUBMITTED, XGL_DBG_MSG_ERROR, OBJTRACK_INVALID_FENCE, "Status Requested for Unsubmitted Fence");\n'
@@ -714,6 +715,13 @@ class Subcommand(object):
'}' % (qual, decl, using_line, ret_val, proto.c_call(), create_line, destroy_line, stmt))
else:
c_call = proto.c_call().replace("(" + proto.params[0].name, "((XGL_PHYSICAL_GPU)gpuw->nextObject", 1)
+ gpu_state = ''
+ if 'GetGpuInfo' in proto.name:
+ gpu_state = ' if (infoType == XGL_INFO_TYPE_PHYSICAL_GPU_PROPERTIES) {\n'
+ gpu_state += ' if (pData != NULL) {\n'
+ gpu_state += ' setGpuInfoState(pData);\n'
+ gpu_state += ' }\n'
+ gpu_state += ' }\n'
funcs.append('%s%s\n'
'{\n'
' XGL_BASE_LAYER_OBJECT* gpuw = (XGL_BASE_LAYER_OBJECT *) %s;\n'
@@ -723,7 +731,8 @@ class Subcommand(object):
' %snextTable.%s;\n'
'%s%s'
'%s'
- '}' % (qual, decl, proto.params[0].name, using_line, ret_val, c_call, create_line, destroy_line, stmt))
+ '%s'
+ '}' % (qual, decl, proto.params[0].name, using_line, ret_val, c_call, create_line, destroy_line, gpu_state, stmt))
if 'WsiX11QueuePresent' == proto.name:
funcs.append("#endif")
elif "ParamChecker" == layer:
@@ -1194,6 +1203,7 @@ class ObjectTrackerSubcommand(Subcommand):
header_txt.append('static objNode *pGlobalHead = NULL;')
header_txt.append('static uint64_t numObjs[XGL_NUM_OBJECT_TYPE] = {0};')
header_txt.append('static uint64_t numTotalObjs = 0;')
+ header_txt.append('static uint32_t maxMemRefsPerSubmission = 0;')
header_txt.append('// Debug function to print global list and each individual object list')
header_txt.append('static void ll_print_lists()')
header_txt.append('{')
@@ -1425,6 +1435,24 @@ class ObjectTrackerSubcommand(Subcommand):
header_txt.append(' validate_status((void *)pMemRefs[i].mem, XGL_OBJECT_TYPE_GPU_MEMORY, OBJSTATUS_GPU_MEM_MAPPED, OBJSTATUS_NONE, XGL_DBG_MSG_ERROR, OBJTRACK_GPU_MEM_MAPPED, "A Mapped Memory Object was referenced in a command buffer");')
header_txt.append(' }')
header_txt.append('}')
+ header_txt.append('')
+ header_txt.append('static void validate_mem_ref_count(uint32_t numRefs) {')
+ header_txt.append(' if (maxMemRefsPerSubmission == 0) {')
+ header_txt.append(' char str[1024];')
+ header_txt.append(' sprintf(str, "xglQueueSubmit called before calling xglGetGpuInfo");')
+ header_txt.append(' layerCbMsg(XGL_DBG_MSG_WARNING, XGL_VALIDATION_LEVEL_0, NULL, 0, OBJTRACK_GETGPUINFO_NOT_CALLED, "OBJTRACK", str);')
+ header_txt.append(' } else {')
+ header_txt.append(' if (numRefs > maxMemRefsPerSubmission) {')
+ header_txt.append(' char str[1024];')
+ header_txt.append(' sprintf(str, "xglQueueSubmit Memory reference count (%d) exceeds allowable GPU limit (%d)", numRefs, maxMemRefsPerSubmission);')
+ header_txt.append(' layerCbMsg(XGL_DBG_MSG_ERROR, XGL_VALIDATION_LEVEL_0, NULL, 0, OBJTRACK_MEMREFCOUNT_MAX_EXCEEDED, "OBJTRACK", str);')
+ header_txt.append(' }')
+ header_txt.append(' }')
+ header_txt.append('}')
+ header_txt.append('')
+ header_txt.append('static void setGpuInfoState(void *pData) {')
+ header_txt.append(' maxMemRefsPerSubmission = ((XGL_PHYSICAL_GPU_PROPERTIES *)pData)->maxMemRefsPerSubmission;')
+ header_txt.append('}')
return "\n".join(header_txt)
def generate_body(self):