From 1a3ed86348d608d42b5fdbd8dcf101d06f0b2cb0 Mon Sep 17 00:00:00 2001 From: George Kyriazis Date: Sat, 15 Oct 2016 17:35:26 -0500 Subject: [PATCH] swr: [rasterizer archrast] Add thread tags to event files. This allows the post-processor to easily detect the API thread and to process frame information. The frame information is needed to optimized how data is processed from worker threads. Reviewed-by: Bruce Cherniak --- src/gallium/drivers/swr/rasterizer/archrast/events.proto | 8 ++++++++ src/gallium/drivers/swr/rasterizer/core/api.cpp | 8 +++++--- .../drivers/swr/rasterizer/scripts/gen_archrast.py | 5 +++++ .../swr/rasterizer/scripts/templates/ar_event_h.template | 3 ++- .../scripts/templates/ar_eventhandlerfile_h.template | 4 ++++ 5 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/gallium/drivers/swr/rasterizer/archrast/events.proto b/src/gallium/drivers/swr/rasterizer/archrast/events.proto index 4ddb7c988c0..107d7a3b31d 100644 --- a/src/gallium/drivers/swr/rasterizer/archrast/events.proto +++ b/src/gallium/drivers/swr/rasterizer/archrast/events.proto @@ -97,6 +97,14 @@ event End uint32_t count; }; +event ThreadStartApiEvent +{ +}; + +event ThreadStartWorkerEvent +{ +}; + event DrawInstancedEvent { uint32_t drawId; diff --git a/src/gallium/drivers/swr/rasterizer/core/api.cpp b/src/gallium/drivers/swr/rasterizer/core/api.cpp index 226924039d1..e67ede2610f 100644 --- a/src/gallium/drivers/swr/rasterizer/core/api.cpp +++ b/src/gallium/drivers/swr/rasterizer/core/api.cpp @@ -112,10 +112,11 @@ HANDLE SwrCreateContext( pContext->ppScratch = new uint8_t*[pContext->NumWorkerThreads]; pContext->pStats = new SWR_STATS[pContext->NumWorkerThreads]; -#if KNOB_ENABLE_AR +#if defined(KNOB_ENABLE_AR) // Setup ArchRast thread contexts which includes +1 for API thread. pContext->pArContext = new HANDLE[pContext->NumWorkerThreads+1]; pContext->pArContext[pContext->NumWorkerThreads] = ArchRast::CreateThreadContext(); + _AR_EVENT(pContext->pArContext[pContext->NumWorkerThreads], ThreadStartApiEvent()); #endif // Allocate scratch space for workers. @@ -133,9 +134,10 @@ HANDLE SwrCreateContext( pContext->ppScratch[i] = (uint8_t*)AlignedMalloc(32 * sizeof(KILOBYTE), KNOB_SIMD_WIDTH * 4); #endif -#if KNOB_ENABLE_AR +#if defined(KNOB_ENABLE_AR) // Initialize worker thread context for ArchRast. pContext->pArContext[i] = ArchRast::CreateThreadContext(); + _AR_EVENT(pContext->pArContext[i], ThreadStartWorkerEvent()); #endif } @@ -383,7 +385,7 @@ void SwrDestroyContext(HANDLE hContext) AlignedFree(pContext->ppScratch[i]); #endif -#if KNOB_ENABLE_AR +#if defined(KNOB_ENABLE_AR) ArchRast::DestroyThreadContext(pContext->pArContext[i]); #endif } diff --git a/src/gallium/drivers/swr/rasterizer/scripts/gen_archrast.py b/src/gallium/drivers/swr/rasterizer/scripts/gen_archrast.py index 1b89a91b8fd..901d6d8d05b 100644 --- a/src/gallium/drivers/swr/rasterizer/scripts/gen_archrast.py +++ b/src/gallium/drivers/swr/rasterizer/scripts/gen_archrast.py @@ -49,6 +49,8 @@ def parse_event_fields(lines, idx, event_dict): field_types = [] end_of_event = False + num_fields = 0 + # record all fields in event definition. # note: we don't check if there's a leading brace. while not end_of_event and idx < len(lines): @@ -60,11 +62,14 @@ def parse_event_fields(lines, idx, event_dict): if field: field_types.append(field.group(2)) field_names.append(field.group(4)) + num_fields += 1 end_of_event = re.match(r"(\s*)};", line) event_dict['field_types'] = field_types event_dict['field_names'] = field_names + event_dict['num_fields'] = num_fields + return idx def parse_enums(lines, idx, event_dict): diff --git a/src/gallium/drivers/swr/rasterizer/scripts/templates/ar_event_h.template b/src/gallium/drivers/swr/rasterizer/scripts/templates/ar_event_h.template index e5c94c7a8d6..b0e67961304 100644 --- a/src/gallium/drivers/swr/rasterizer/scripts/templates/ar_event_h.template +++ b/src/gallium/drivers/swr/rasterizer/scripts/templates/ar_event_h.template @@ -86,9 +86,10 @@ namespace ArchRast ${field_types[i]} ${field_names[i]}, % endif % if i == len(field_names)-1: - ${field_types[i]} ${field_names[i]}) + ${field_types[i]} ${field_names[i]} % endif % endfor + ) { % for i in range(len(field_names)): data.${field_names[i]} = ${field_names[i]}; diff --git a/src/gallium/drivers/swr/rasterizer/scripts/templates/ar_eventhandlerfile_h.template b/src/gallium/drivers/swr/rasterizer/scripts/templates/ar_eventhandlerfile_h.template index 1924b15ca32..6a62f170a83 100644 --- a/src/gallium/drivers/swr/rasterizer/scripts/templates/ar_eventhandlerfile_h.template +++ b/src/gallium/drivers/swr/rasterizer/scripts/templates/ar_eventhandlerfile_h.template @@ -83,7 +83,11 @@ namespace ArchRast % for name in protos['event_names']: virtual void handle(${name}& event) { +% if protos['events'][name]['num_fields'] == 0: + write(${protos['events'][name]['event_id']}, (char*)&event.data, 0); +% else: write(${protos['events'][name]['event_id']}, (char*)&event.data, sizeof(event.data)); +%endif } % endfor -- 2.30.2