summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2017-04-07 21:38:09 +0200
committerMarek Olšák <[email protected]>2017-04-28 21:47:35 +0200
commitdcea7e5d196bea313aee955311300162811837b2 (patch)
tree0916e551c02a1fad29c409407c05963fb42b3f53 /src
parenteb35238ffe55eb27930419acf0e145281ea3db9c (diff)
radeonsi: add si_shader::prolog2
For a GS prolog in merged ES-GS. Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/radeonsi/si_debug.c4
-rw-r--r--src/gallium/drivers/radeonsi/si_shader.c21
-rw-r--r--src/gallium/drivers/radeonsi/si_shader.h1
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;