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 <bas@basnieuwenhuizen.nl>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie 2017-04-19 06:18:23 +10:00
parent 0e6d532d32
commit 399ebd2a84
2 changed files with 39 additions and 0 deletions

View 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;
}

View 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