[Mesa-dev] [PATCH 1/5] swr: [rasterizer archrast] Add thread tags to event files.

Cherniak, Bruce bruce.cherniak at intel.com
Thu Oct 27 15:55:00 UTC 2016


Reviewed-by: Bruce Cherniak <bruce.cherniak at intel.com> 

> On Oct 26, 2016, at 7:08 PM, George Kyriazis <george.kyriazis at intel.com> wrote:
> 
> 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.
> ---
> src/gallium/drivers/swr/rasterizer/archrast/events.proto          | 8 ++++++++
> src/gallium/drivers/swr/rasterizer/core/api.cpp                   | 8 +++++---
> src/gallium/drivers/swr/rasterizer/scripts/gen_archrast.py        | 5 +++++
> .../drivers/swr/rasterizer/scripts/templates/ar_event_h.template  | 3 ++-
> .../rasterizer/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 4ddb7c9..107d7a3 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 2269240..e67ede2 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 1b89a91..901d6d8 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 e5c94c7..b0e6796 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 1924b15..6a62f17 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.7.4
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev



More information about the mesa-dev mailing list