swr/rast: Add string handling to AR event framework
For use by an internal tool Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
This commit is contained in:
@@ -445,5 +445,6 @@ event SWTagDispatchEvent
|
|||||||
event SWTagFlushEvent
|
event SWTagFlushEvent
|
||||||
{
|
{
|
||||||
uint32_t drawId;
|
uint32_t drawId;
|
||||||
uint32_t flushType;
|
char flushReason[256];
|
||||||
|
uint32_t flushType;
|
||||||
};
|
};
|
@@ -27,30 +27,29 @@ import re
|
|||||||
from gen_common import *
|
from gen_common import *
|
||||||
|
|
||||||
def parse_event_fields(lines, idx, event_dict):
|
def parse_event_fields(lines, idx, event_dict):
|
||||||
field_names = []
|
fields = []
|
||||||
field_types = []
|
|
||||||
end_of_event = False
|
end_of_event = False
|
||||||
|
|
||||||
num_fields = 0
|
|
||||||
|
|
||||||
# record all fields in event definition.
|
# record all fields in event definition.
|
||||||
# note: we don't check if there's a leading brace.
|
# note: we don't check if there's a leading brace.
|
||||||
while not end_of_event and idx < len(lines):
|
while not end_of_event and idx < len(lines):
|
||||||
line = lines[idx].rstrip()
|
line = lines[idx].rstrip()
|
||||||
idx += 1
|
idx += 1
|
||||||
|
|
||||||
field = re.match(r'(\s*)(\w+)(\s*)(\w+)', line)
|
match = re.match(r'(\s*)([\w\*]+)(\s*)([\w]+)(\[\d+\])*', line)
|
||||||
|
|
||||||
if field:
|
if match:
|
||||||
field_types.append(field.group(2))
|
field = {
|
||||||
field_names.append(field.group(4))
|
"type": match.group(2),
|
||||||
num_fields += 1
|
"name": match.group(4),
|
||||||
|
"size": int(match.group(5)[1:-1]) if match.group(5) else 1
|
||||||
|
}
|
||||||
|
fields.append(field)
|
||||||
|
|
||||||
end_of_event = re.match(r'(\s*)};', line)
|
end_of_event = re.match(r'(\s*)};', line)
|
||||||
|
|
||||||
event_dict['field_types'] = field_types
|
event_dict['fields'] = fields
|
||||||
event_dict['field_names'] = field_names
|
event_dict['num_fields'] = len(fields)
|
||||||
event_dict['num_fields'] = num_fields
|
|
||||||
|
|
||||||
return idx
|
return idx
|
||||||
|
|
||||||
|
@@ -162,7 +162,7 @@ def parse_ir_builder(input_file):
|
|||||||
func_name == 'CreateGEP' or
|
func_name == 'CreateGEP' or
|
||||||
func_name == 'CreateLoad' or
|
func_name == 'CreateLoad' or
|
||||||
func_name == 'CreateMaskedLoad' or
|
func_name == 'CreateMaskedLoad' or
|
||||||
func_name == 'CreateStore' or
|
func_name == 'CreateStore' or
|
||||||
func_name == 'CreateMaskedStore' or
|
func_name == 'CreateMaskedStore' or
|
||||||
func_name == 'CreateElementUnorderedAtomicMemCpy'):
|
func_name == 'CreateElementUnorderedAtomicMemCpy'):
|
||||||
ignore = True
|
ignore = True
|
||||||
|
@@ -68,11 +68,14 @@ namespace ArchRast
|
|||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
struct ${name}Data
|
struct ${name}Data
|
||||||
{<%
|
{<%
|
||||||
field_names = protos['events'][name]['field_names']
|
fields = protos['events'][name]['fields'] %>
|
||||||
field_types = protos['events'][name]['field_types'] %>
|
|
||||||
// Fields
|
// Fields
|
||||||
% for i in range(len(field_names)):
|
% for i in range(len(fields)):
|
||||||
${field_types[i]} ${field_names[i]};
|
% if fields[i]['size'] > 1:
|
||||||
|
${fields[i]['type']} ${fields[i]['name']}[${fields[i]['size']}];
|
||||||
|
% else:
|
||||||
|
${fields[i]['type']} ${fields[i]['name']};
|
||||||
|
% endif
|
||||||
% endfor
|
% endfor
|
||||||
};
|
};
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
@@ -82,24 +85,44 @@ namespace ArchRast
|
|||||||
//////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////
|
||||||
struct ${name} : Event
|
struct ${name} : Event
|
||||||
{<%
|
{<%
|
||||||
field_names = protos['events'][name]['field_names']
|
fields = protos['events'][name]['fields'] %>
|
||||||
field_types = protos['events'][name]['field_types'] %>
|
|
||||||
${name}Data data;
|
${name}Data data;
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
${name}(
|
${name}(
|
||||||
% for i in range(len(field_names)):
|
% for i in range(len(fields)):
|
||||||
% if i < len(field_names)-1:
|
% if i < len(fields)-1:
|
||||||
${field_types[i]} ${field_names[i]},
|
% if fields[i]['size'] > 1:
|
||||||
|
${fields[i]['type']}* ${fields[i]['name']},
|
||||||
|
uint32_t ${fields[i]['name']}_size,
|
||||||
|
% else:
|
||||||
|
${fields[i]['type']} ${fields[i]['name']},
|
||||||
|
% endif
|
||||||
% endif
|
% endif
|
||||||
% if i == len(field_names)-1:
|
% if i == len(fields)-1:
|
||||||
${field_types[i]} ${field_names[i]}
|
% if fields[i]['size'] > 1:
|
||||||
|
${fields[i]['type']}* ${fields[i]['name']},
|
||||||
|
uint32_t ${fields[i]['name']}_size
|
||||||
|
% else:
|
||||||
|
${fields[i]['type']} ${fields[i]['name']}
|
||||||
|
% endif
|
||||||
% endif
|
% endif
|
||||||
% endfor
|
% endfor
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
% for i in range(len(field_names)):
|
% for i in range(len(fields)):
|
||||||
data.${field_names[i]} = ${field_names[i]};
|
% if fields[i]['size'] > 1:
|
||||||
|
% if fields[i]['type'] == 'char':
|
||||||
|
// Copy size of string (null-terminated) followed by string buffer info entire buffer
|
||||||
|
SWR_ASSERT(${fields[i]['name']}_size + 1 < ${fields[i]['size']} - sizeof(uint32_t), "String length must be less than size of char buffer - size(uint32_t)!");
|
||||||
|
memcpy(data.${fields[i]['name']}, &${fields[i]['name']}_size, sizeof(uint32_t));
|
||||||
|
strcpy_s(data.${fields[i]['name']} + sizeof(uint32_t), ${fields[i]['name']}_size + 1, ${fields[i]['name']});
|
||||||
|
% else:
|
||||||
|
memcpy(data.${fields[i]['name']}, ${fields[i]['name']}, ${fields[i]['name']}_size);
|
||||||
|
% endif
|
||||||
|
% else:
|
||||||
|
data.${fields[i]['name']} = ${fields[i]['name']};
|
||||||
|
% endif
|
||||||
% endfor
|
% endfor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -559,7 +559,7 @@ static SIMDINLINE Float SIMDCALL
|
|||||||
//
|
//
|
||||||
// SELECT4(src, control) {
|
// SELECT4(src, control) {
|
||||||
// CASE(control[1:0])
|
// CASE(control[1:0])
|
||||||
// 0: tmp[127:0] : = src[127:0]
|
// 0 : tmp[127:0] : = src[127:0]
|
||||||
// 1 : tmp[127:0] : = src[255:128]
|
// 1 : tmp[127:0] : = src[255:128]
|
||||||
// 2 : tmp[127:0] : = src[383:256]
|
// 2 : tmp[127:0] : = src[383:256]
|
||||||
// 3 : tmp[127:0] : = src[511:384]
|
// 3 : tmp[127:0] : = src[511:384]
|
||||||
|
Reference in New Issue
Block a user