Thanks! Pushed.
2014-07-23 18:32 GMT+02:00 Alex Deucher <alexdeuc...@gmail.com>: > 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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev