diff options
author | Marek Olšák <[email protected]> | 2017-04-07 21:38:09 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-04-28 21:47:35 +0200 |
commit | dcea7e5d196bea313aee955311300162811837b2 (patch) | |
tree | 0916e551c02a1fad29c409407c05963fb42b3f53 | |
parent | eb35238ffe55eb27930419acf0e145281ea3db9c (diff) |
radeonsi: add si_shader::prolog2
For a GS prolog in merged ES-GS.
Reviewed-by: Nicolai Hähnle <[email protected]>
-rw-r--r-- | src/gallium/drivers/radeonsi/si_debug.c | 4 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_shader.c | 21 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_shader.h | 1 |
3 files changed, 25 insertions, 1 deletions
diff --git a/src/gallium/drivers/radeonsi/si_debug.c b/src/gallium/drivers/radeonsi/si_debug.c index 038c8b47931..9634901e709 100644 --- a/src/gallium/drivers/radeonsi/si_debug.c +++ b/src/gallium/drivers/radeonsi/si_debug.c @@ -643,6 +643,10 @@ static void si_print_annotated_shader(struct si_shader *shader, si_add_split_disasm(shader->previous_stage->binary.disasm_string, start_addr, &num_inst, instructions); } + if (shader->prolog2) { + si_add_split_disasm(shader->prolog2->binary.disasm_string, + start_addr, &num_inst, instructions); + } si_add_split_disasm(shader->binary.disasm_string, start_addr, &num_inst, instructions); if (shader->epilog) { diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index ed2e0669694..c4e659be24e 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -6349,6 +6349,8 @@ static unsigned si_get_shader_binary_size(struct si_shader *shader) size += shader->prolog->binary.code_size; if (shader->previous_stage) size += shader->previous_stage->binary.code_size; + if (shader->prolog2) + size += shader->prolog2->binary.code_size; if (shader->epilog) size += shader->epilog->binary.code_size; return size; @@ -6360,6 +6362,8 @@ int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader) shader->prolog ? &shader->prolog->binary : NULL; const struct ac_shader_binary *previous_stage = shader->previous_stage ? &shader->previous_stage->binary : NULL; + const struct ac_shader_binary *prolog2 = + shader->prolog2 ? &shader->prolog2->binary : NULL; const struct ac_shader_binary *epilog = shader->epilog ? &shader->epilog->binary : NULL; const struct ac_shader_binary *mainb = &shader->binary; @@ -6369,7 +6373,9 @@ int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader) assert(!prolog || !prolog->rodata_size); assert(!previous_stage || !previous_stage->rodata_size); - assert((!prolog && !previous_stage && !epilog) || !mainb->rodata_size); + assert(!prolog2 || !prolog2->rodata_size); + assert((!prolog && !previous_stage && !prolog2 && !epilog) || + !mainb->rodata_size); assert(!epilog || !epilog->rodata_size); /* GFX9 can fetch at most 128 bytes past the end of the shader. @@ -6400,6 +6406,10 @@ int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader *shader) previous_stage->code_size); ptr += previous_stage->code_size; } + if (prolog2) { + util_memcpy_cpu_to_le32(ptr, prolog2->code, prolog2->code_size); + ptr += prolog2->code_size; + } util_memcpy_cpu_to_le32(ptr, mainb->code, mainb->code_size); ptr += mainb->code_size; @@ -6610,6 +6620,9 @@ void si_shader_dump(struct si_screen *sscreen, struct si_shader *shader, if (shader->previous_stage) si_shader_dump_disassembly(&shader->previous_stage->binary, debug, "previous stage", file); + if (shader->prolog2) + si_shader_dump_disassembly(&shader->prolog2->binary, + debug, "prolog2", file); si_shader_dump_disassembly(&shader->binary, debug, "main", file); @@ -9009,6 +9022,12 @@ int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm, shader->info.uses_instanceid |= shader->previous_stage->info.uses_instanceid; } + if (shader->prolog2) { + shader->config.num_sgprs = MAX2(shader->config.num_sgprs, + shader->prolog2->config.num_sgprs); + shader->config.num_vgprs = MAX2(shader->config.num_vgprs, + shader->prolog2->config.num_vgprs); + } if (shader->epilog) { shader->config.num_sgprs = MAX2(shader->config.num_sgprs, shader->epilog->config.num_sgprs); diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index ad72a3d3899..8d60ed967c5 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -473,6 +473,7 @@ struct si_shader { struct si_shader_part *prolog; struct si_shader *previous_stage; /* for GFX9 */ + struct si_shader_part *prolog2; struct si_shader_part *epilog; struct si_pm4_state *pm4; |