radv/meta: add common shader vertex generation function
authorDave Airlie <airlied@redhat.com>
Tue, 18 Apr 2017 20:18:23 +0000 (06:18 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 19 Apr 2017 00:02:39 +0000 (10:02 +1000)
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 <bas@basnieuwenhuizen.nl>
Signed-off-by: Dave Airlie <airlied@redhat.com>
src/amd/vulkan/radv_meta.c
src/amd/vulkan/radv_meta.h

index feb2ab8bfa6527db968f21cc62b7ae73a5a55292..bb95b36b56b2d95785bd20572f42baf3c78eafd8 100644 (file)
@@ -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;
+}
index 8702ca4dbbd19a1c3bd93f857a033d2f3a277e27..6cad94c89e0138e5ad8a51088f396a55a8fcc528 100644 (file)
@@ -221,6 +221,12 @@ void radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer,
 void radv_blit_to_prime_linear(struct radv_cmd_buffer *cmd_buffer,
                               struct radv_image *image,
                               struct radv_image *linear_image);
+
+/* common nir builder helpers */
+#include "nir_builder.h"
+
+nir_ssa_def *radv_meta_gen_rect_vertices(nir_builder *vs_b);
+
 #ifdef __cplusplus
 }
 #endif