On Wed, Jul 23, 2014 at 5:57 AM, Glenn Kennard <glenn.kenn...@gmail.com> wrote: > Map TGSI_SEMANTIC_SAMPLEMASK to register/component. > Enable face register when sample mask is needed by shader. > Requires Evergreen/Cayman > --- > I think the rest of the sample related bits in gpu_shader5 are > from GL_ARB_sample_shading which isn't implemented yet in r600. > > Passes samplemaskin-basic piglit, no regressions, on radeon 6670
Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> > > docs/GL3.txt | 2 +- > src/gallium/drivers/r600/evergreen_state.c | 10 ++++++-- > src/gallium/drivers/r600/r600_shader.c | 37 > ++++++++++++++++++++++++++---- > 3 files changed, 41 insertions(+), 8 deletions(-) > > diff --git a/docs/GL3.txt b/docs/GL3.txt > index 8128692..53e19e0 100644 > --- a/docs/GL3.txt > +++ b/docs/GL3.txt > @@ -109,7 +109,7 @@ GL 4.0: > - Enhanced textureGather DONE (i965, nvc0, > radeonsi) > - Geometry shader instancing DONE (i965, nvc0) > - Geometry shader multiple streams DONE (i965, nvc0) > - - Enhanced per-sample shading DONE (i965) > + - Enhanced per-sample shading DONE (i965, r600) > - Interpolation functions DONE (i965) > - New overload resolution rules DONE > GL_ARB_gpu_shader_fp64 started (Dave) > diff --git a/src/gallium/drivers/r600/evergreen_state.c > b/src/gallium/drivers/r600/evergreen_state.c > index 8f5ba5f..839d2ae 100644 > --- a/src/gallium/drivers/r600/evergreen_state.c > +++ b/src/gallium/drivers/r600/evergreen_state.c > @@ -2843,8 +2843,14 @@ void evergreen_update_ps_state(struct pipe_context > *ctx, struct r600_pipe_shader > POSITION goes via GPRs from the SC so isn't counted */ > if (rshader->input[i].name == TGSI_SEMANTIC_POSITION) > pos_index = i; > - else if (rshader->input[i].name == TGSI_SEMANTIC_FACE) > - face_index = i; > + else if (rshader->input[i].name == TGSI_SEMANTIC_FACE) { > + if (face_index == -1) > + face_index = i; > + } > + else if (rshader->input[i].name == TGSI_SEMANTIC_SAMPLEMASK) { > + if (face_index == -1) > + face_index = i; /* lives in same register, > same enable bit */ > + } > else { > ninterp++; > if (rshader->input[i].interpolate == > TGSI_INTERPOLATE_LINEAR) > diff --git a/src/gallium/drivers/r600/r600_shader.c > b/src/gallium/drivers/r600/r600_shader.c > index db928f3..c8ab4dd 100644 > --- a/src/gallium/drivers/r600/r600_shader.c > +++ b/src/gallium/drivers/r600/r600_shader.c > @@ -287,7 +287,9 @@ struct r600_shader_ctx { > boolean input_linear; > boolean input_perspective; > int num_interp_gpr; > + /* evergreen/cayman also store sample mask in face register */ > int face_gpr; > + boolean has_samplemask; > int colors_used; > boolean clip_vertex_write; > unsigned cv_output; > @@ -498,7 +500,8 @@ static int r600_spi_sid(struct r600_shader_io * io) > if (name == TGSI_SEMANTIC_POSITION || > name == TGSI_SEMANTIC_PSIZE || > name == TGSI_SEMANTIC_EDGEFLAG || > - name == TGSI_SEMANTIC_FACE) > + name == TGSI_SEMANTIC_FACE || > + name == TGSI_SEMANTIC_SAMPLEMASK) > index = 0; > else { > if (name == TGSI_SEMANTIC_GENERIC) { > @@ -585,7 +588,8 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx) > ctx->shader->input[i].spi_sid = > r600_spi_sid(&ctx->shader->input[i]); > switch (ctx->shader->input[i].name) { > case TGSI_SEMANTIC_FACE: > - ctx->face_gpr = ctx->shader->input[i].gpr; > + if (ctx->face_gpr == -1) > + ctx->face_gpr = > ctx->shader->input[i].gpr; > break; > case TGSI_SEMANTIC_COLOR: > ctx->colors_used++; > @@ -675,7 +679,14 @@ static int tgsi_declaration(struct r600_shader_ctx *ctx) > break; > > case TGSI_FILE_SYSTEM_VALUE: > - if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) { > + if (d->Semantic.Name == TGSI_SEMANTIC_SAMPLEMASK) { > + ctx->has_samplemask = true; > + /* lives in Front Face GPR */ > + if (ctx->face_gpr == -1) > + ctx->face_gpr = > ctx->file_offset[TGSI_FILE_SYSTEM_VALUE] + d->Range.First; > + break; > + } > + else if (d->Semantic.Name == TGSI_SEMANTIC_INSTANCEID) { > if (!ctx->native_integers) { > struct r600_bytecode_alu alu; > memset(&alu, 0, sizeof(struct > r600_bytecode_alu)); > @@ -729,7 +740,8 @@ static int evergreen_gpr_count(struct r600_shader_ctx > *ctx) > for (i = 0; i < ctx->info.num_inputs; i++) { > /* skip position/face */ > if (ctx->info.input_semantic_name[i] == > TGSI_SEMANTIC_POSITION || > - ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE) > + ctx->info.input_semantic_name[i] == TGSI_SEMANTIC_FACE || > + ctx->info.input_semantic_name[i] == > TGSI_SEMANTIC_SAMPLEMASK) > continue; > if (ctx->info.input_interpolate[i] == TGSI_INTERPOLATE_LINEAR) > ctx->input_linear = TRUE; > @@ -781,7 +793,13 @@ static void tgsi_src(struct r600_shader_ctx *ctx, > r600_src->sel = V_SQ_ALU_SRC_LITERAL; > memcpy(r600_src->value, ctx->literals + index * 4, > sizeof(r600_src->value)); > } else if (tgsi_src->Register.File == TGSI_FILE_SYSTEM_VALUE) { > - if > (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == > TGSI_SEMANTIC_INSTANCEID) { > + if > (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == > TGSI_SEMANTIC_SAMPLEMASK) { > + r600_src->swizzle[0] = 2; // Z value > + r600_src->swizzle[0] = 2; > + r600_src->swizzle[0] = 2; > + r600_src->swizzle[0] = 2; > + r600_src->sel = ctx->face_gpr; > + } else if > (ctx->info.system_value_semantic_name[tgsi_src->Register.Index] == > TGSI_SEMANTIC_INSTANCEID) { > r600_src->swizzle[0] = 3; > r600_src->swizzle[1] = 3; > r600_src->swizzle[2] = 3; > @@ -1586,6 +1604,7 @@ static int r600_shader_from_tgsi(struct r600_context > *rctx, > ctx.gs_next_vertex = 0; > > ctx.face_gpr = -1; > + ctx.has_samplemask = false; > ctx.fragcoord_input = -1; > ctx.colors_used = 0; > ctx.clip_vertex_write = 0; > @@ -1745,6 +1764,14 @@ static int r600_shader_from_tgsi(struct r600_context > *rctx, > > shader->ring_item_size = ctx.next_ring_offset; > > + /* Need to tell setup to program FACE register */ > + if (ctx.has_samplemask && ctx.face_gpr != -1) { > + i = ctx.shader->ninput++; > + ctx.shader->input[i].name = TGSI_SEMANTIC_SAMPLEMASK; > + ctx.shader->input[i].spi_sid = 0; > + ctx.shader->input[i].gpr = ctx.face_gpr; > + } > + > /* Process two side if needed */ > if (shader->two_side && ctx.colors_used) { > int i, count = ctx.shader->ninput; > -- > 1.8.3.2 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev