[Mesa-dev] [PATCH 1/5] swr: [rasterizer archrast] Add thread tags to event files.
George Kyriazis
george.kyriazis at intel.com
Thu Oct 27 00:08:21 UTC 2016
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
More information about the mesa-dev
mailing list