summaryrefslogtreecommitdiffstats
path: root/src/amd/vulkan/radv_meta.c
diff options
context:
space:
mode:
authorDave Airlie <[email protected]>2017-04-19 06:18:23 +1000
committerDave Airlie <[email protected]>2017-04-19 10:02:39 +1000
commit399ebd2a84a133bd2ca3da388a059fd3bafe33f5 (patch)
tree8ba992888186504fc252b2a3326a6f21a41c4da7 /src/amd/vulkan/radv_meta.c
parent0e6d532d327a70b0ec6522754b3d8bee6312335f (diff)
radv/meta: add common shader vertex generation function
Instead of passing in the same 1.0, -1.0 combinations via vertex buffers, we can just use vertex id to have the vertex shader build them. This function introduces the generator code needed, later patches will use this. Reviewed-by: Bas Nieuwenhuizen <[email protected]> Signed-off-by: Dave Airlie <[email protected]>
Diffstat (limited to 'src/amd/vulkan/radv_meta.c')
-rw-r--r--src/amd/vulkan/radv_meta.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/amd/vulkan/radv_meta.c b/src/amd/vulkan/radv_meta.c
index feb2ab8bfa6..bb95b36b56b 100644
--- a/src/amd/vulkan/radv_meta.c
+++ b/src/amd/vulkan/radv_meta.c
@@ -416,3 +416,36 @@ radv_meta_save_graphics_reset_vport_scissor_novertex(struct radv_meta_saved_stat
cmd_buffer->state.dynamic.scissor.count = 0;
cmd_buffer->state.dirty |= dirty_state;
}
+
+nir_ssa_def *radv_meta_gen_rect_vertices(nir_builder *vs_b)
+{
+
+ nir_intrinsic_instr *vertex_id = nir_intrinsic_instr_create(vs_b->shader, nir_intrinsic_load_vertex_id_zero_base);
+ nir_ssa_dest_init(&vertex_id->instr, &vertex_id->dest, 1, 32, "vertexid");
+ nir_builder_instr_insert(vs_b, &vertex_id->instr);
+
+ /* vertex 0 - -1.0, -1.0 */
+ /* vertex 1 - -1.0, 1.0 */
+ /* vertex 2 - 1.0, -1.0 */
+ /* so channel 0 is vertex_id != 2 ? -1.0 : 1.0
+ channel 1 is vertex id != 1 ? -1.0 : 1.0 */
+
+ nir_ssa_def *c0cmp = nir_ine(vs_b, &vertex_id->dest.ssa,
+ nir_imm_int(vs_b, 2));
+ nir_ssa_def *c1cmp = nir_ine(vs_b, &vertex_id->dest.ssa,
+ nir_imm_int(vs_b, 1));
+
+ nir_ssa_def *comp[4];
+ comp[0] = nir_bcsel(vs_b, c0cmp,
+ nir_imm_float(vs_b, -1.0),
+ nir_imm_float(vs_b, 1.0));
+
+ comp[1] = nir_bcsel(vs_b, c1cmp,
+ nir_imm_float(vs_b, -1.0),
+ nir_imm_float(vs_b, 1.0));
+ comp[2] = nir_imm_float(vs_b, 0.0);
+ comp[3] = nir_imm_float(vs_b, 1.0);
+ nir_ssa_def *outvec = nir_vec(vs_b, comp, 4);
+
+ return outvec;
+}