diff --git a/src/vrend_shader.c b/src/vrend_shader.c index a5a97bf..fce03a7 100644 --- a/src/vrend_shader.c +++ b/src/vrend_shader.c @@ -1295,9 +1295,65 @@ static int handle_fragment_proc_exit(struct dump_ctx *ctx) return TRUE; } +static bool set_texture_reqs(struct dump_ctx *ctx, + struct tgsi_full_instruction *inst, + int sreg_index, + bool *is_shad) +{ + if (sreg_index >= ARRAY_SIZE(ctx->samplers)) { + fprintf(stderr, "Sampler view exceeded, max is %lu\n", ARRAY_SIZE(ctx->samplers)); + return false; + } + ctx->samplers[sreg_index].tgsi_sampler_type = inst->Texture.Texture; + + switch (inst->Texture.Texture) { + case TGSI_TEXTURE_1D: + case TGSI_TEXTURE_2D: + case TGSI_TEXTURE_3D: + case TGSI_TEXTURE_CUBE: + case TGSI_TEXTURE_1D_ARRAY: + case TGSI_TEXTURE_2D_ARRAY: + break; + case TGSI_TEXTURE_SHADOWCUBE_ARRAY: + *is_shad = true; + case TGSI_TEXTURE_CUBE_ARRAY: + ctx->shader_req_bits |= SHADER_REQ_CUBE_ARRAY; + break; + case TGSI_TEXTURE_2D_MSAA: + case TGSI_TEXTURE_2D_ARRAY_MSAA: + ctx->shader_req_bits |= SHADER_REQ_SAMPLER_MS; + break; + case TGSI_TEXTURE_BUFFER: + ctx->uses_sampler_buf = true; + break; + case TGSI_TEXTURE_SHADOWRECT: + *is_shad = true; + case TGSI_TEXTURE_RECT: + ctx->shader_req_bits |= SHADER_REQ_SAMPLER_RECT; + break; + case TGSI_TEXTURE_SHADOW1D: + case TGSI_TEXTURE_SHADOW2D: + case TGSI_TEXTURE_SHADOWCUBE: + case TGSI_TEXTURE_SHADOW1D_ARRAY: + case TGSI_TEXTURE_SHADOW2D_ARRAY: + *is_shad = true; + break; + default: + fprintf(stderr, "unhandled texture: %x\n", inst->Texture.Texture); + return false; + } + + if (ctx->cfg->glsl_version >= 140) + if ((ctx->shader_req_bits & SHADER_REQ_SAMPLER_RECT) || ctx->uses_sampler_buf) + require_glsl_ver(ctx, 140); + + return true; +} + /* size queries are pretty much separate */ static int emit_txq(struct dump_ctx *ctx, struct tgsi_full_instruction *inst, + int sreg_index, char srcs[4][255], char dsts[3][255], const char *writemask) @@ -1306,7 +1362,12 @@ static int emit_txq(struct dump_ctx *ctx, char bias[128] = {0}; char buf[512]; const int sampler_index = 1; + bool is_shad; enum vrend_type_qualifier dtypeprefix = INT_BITS_TO_FLOAT; + + if (set_texture_reqs(ctx, inst, sreg_index, &is_shad) == false) + return FALSE; + /* no lod parameter for txq for these */ if (inst->Texture.Texture != TGSI_TEXTURE_RECT && inst->Texture.Texture != TGSI_TEXTURE_SHADOWRECT && @@ -1385,12 +1446,8 @@ static int translate_tex(struct dump_ctx *ctx, int sampler_index; const char *tex_ext; - if (sreg_index >= ARRAY_SIZE(ctx->samplers)) { - fprintf(stderr, "Sampler view exceeded, max is %lu\n", ARRAY_SIZE(ctx->samplers)); + if (set_texture_reqs(ctx, inst, sreg_index, &is_shad) == false) return FALSE; - } - - ctx->samplers[sreg_index].tgsi_sampler_type = inst->Texture.Texture; switch (ctx->samplers[sreg_index].tgsi_sampler_return) { case TGSI_RETURN_TYPE_SINT: @@ -1407,54 +1464,13 @@ static int translate_tex(struct dump_ctx *ctx, break; } - switch (inst->Texture.Texture) { - case TGSI_TEXTURE_1D: - case TGSI_TEXTURE_2D: - case TGSI_TEXTURE_3D: - case TGSI_TEXTURE_CUBE: - case TGSI_TEXTURE_1D_ARRAY: - case TGSI_TEXTURE_2D_ARRAY: - break; - case TGSI_TEXTURE_SHADOWCUBE_ARRAY: - is_shad = true; - case TGSI_TEXTURE_CUBE_ARRAY: - ctx->shader_req_bits |= SHADER_REQ_CUBE_ARRAY; - break; - case TGSI_TEXTURE_2D_MSAA: - case TGSI_TEXTURE_2D_ARRAY_MSAA: - ctx->shader_req_bits |= SHADER_REQ_SAMPLER_MS; - break; - case TGSI_TEXTURE_BUFFER: - ctx->uses_sampler_buf = true; - break; - case TGSI_TEXTURE_SHADOWRECT: - is_shad = true; - case TGSI_TEXTURE_RECT: - ctx->shader_req_bits |= SHADER_REQ_SAMPLER_RECT; - break; - case TGSI_TEXTURE_SHADOW1D: - case TGSI_TEXTURE_SHADOW2D: - case TGSI_TEXTURE_SHADOWCUBE: - case TGSI_TEXTURE_SHADOW1D_ARRAY: - case TGSI_TEXTURE_SHADOW2D_ARRAY: - is_shad = true; - break; - default: - fprintf(stderr, "unhandled texture: %x\n", inst->Texture.Texture); - return false; - } - - if (ctx->cfg->glsl_version >= 140) - if ((ctx->shader_req_bits & SHADER_REQ_SAMPLER_RECT) || ctx->uses_sampler_buf) - require_glsl_ver(ctx, 140); - sampler_index = 1; if (inst->Instruction.Opcode == TGSI_OPCODE_LODQ) ctx->shader_req_bits |= SHADER_REQ_LODQ; if (inst->Instruction.Opcode == TGSI_OPCODE_TXQ) { - return emit_txq(ctx, inst, srcs, dsts, writemask); + return emit_txq(ctx, inst, sreg_index, srcs, dsts, writemask); } switch (inst->Texture.Texture) {