diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index 5544da3..8f7c541 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -2953,70 +2953,76 @@ static void vrend_draw_bind_vertex_binding(struct vrend_context *ctx, } } -static void vrend_draw_bind_samplers(struct vrend_context *ctx) +static void vrend_draw_bind_samplers_shader(struct vrend_context *ctx, + int shader_type, + int *sampler_id) { - int sampler_id; - int i; - int shader_type; + int index = 0; + for (int i = 0; i < ctx->sub->views[shader_type].num_views; i++) { + struct vrend_resource *texture = NULL; - sampler_id = 0; - for (shader_type = PIPE_SHADER_VERTEX; shader_type <= ctx->sub->last_shader_idx; shader_type++) { - int index = 0; - for (i = 0; i < ctx->sub->views[shader_type].num_views; i++) { - struct vrend_resource *texture = NULL; + if (ctx->sub->views[shader_type].views[i]) { + texture = ctx->sub->views[shader_type].views[i]->texture; + } - if (ctx->sub->views[shader_type].views[i]) { - texture = ctx->sub->views[shader_type].views[i]->texture; - } + if (!(ctx->sub->prog->samplers_used_mask[shader_type] & (1 << i))) + continue; - if (!(ctx->sub->prog->samplers_used_mask[shader_type] & (1 << i))) - continue; + if (ctx->sub->prog->samp_locs[shader_type]) + glUniform1i(ctx->sub->prog->samp_locs[shader_type][index], *sampler_id); + + if (ctx->sub->prog->shadow_samp_mask[shader_type] & (1 << i)) { + struct vrend_sampler_view *tview = ctx->sub->views[shader_type].views[i]; + glUniform4f(ctx->sub->prog->shadow_samp_mask_locs[shader_type][index], + (tview->gl_swizzle_r == GL_ZERO || tview->gl_swizzle_r == GL_ONE) ? 0.0 : 1.0, + (tview->gl_swizzle_g == GL_ZERO || tview->gl_swizzle_g == GL_ONE) ? 0.0 : 1.0, + (tview->gl_swizzle_b == GL_ZERO || tview->gl_swizzle_b == GL_ONE) ? 0.0 : 1.0, + (tview->gl_swizzle_a == GL_ZERO || tview->gl_swizzle_a == GL_ONE) ? 0.0 : 1.0); + glUniform4f(ctx->sub->prog->shadow_samp_add_locs[shader_type][index], + tview->gl_swizzle_r == GL_ONE ? 1.0 : 0.0, + tview->gl_swizzle_g == GL_ONE ? 1.0 : 0.0, + tview->gl_swizzle_b == GL_ONE ? 1.0 : 0.0, + tview->gl_swizzle_a == GL_ONE ? 1.0 : 0.0); + } + + glActiveTexture(GL_TEXTURE0 + *sampler_id); + if (texture) { + GLuint id; + GLenum target = texture->target; + + if (texture->is_buffer) { + id = texture->tbo_tex_id; + target = GL_TEXTURE_BUFFER; + } else + id = texture->id; - if (ctx->sub->prog->samp_locs[shader_type]) - glUniform1i(ctx->sub->prog->samp_locs[shader_type][index], sampler_id); - - if (ctx->sub->prog->shadow_samp_mask[shader_type] & (1 << i)) { - struct vrend_sampler_view *tview = ctx->sub->views[shader_type].views[i]; - glUniform4f(ctx->sub->prog->shadow_samp_mask_locs[shader_type][index], - (tview->gl_swizzle_r == GL_ZERO || tview->gl_swizzle_r == GL_ONE) ? 0.0 : 1.0, - (tview->gl_swizzle_g == GL_ZERO || tview->gl_swizzle_g == GL_ONE) ? 0.0 : 1.0, - (tview->gl_swizzle_b == GL_ZERO || tview->gl_swizzle_b == GL_ONE) ? 0.0 : 1.0, - (tview->gl_swizzle_a == GL_ZERO || tview->gl_swizzle_a == GL_ONE) ? 0.0 : 1.0); - glUniform4f(ctx->sub->prog->shadow_samp_add_locs[shader_type][index], - tview->gl_swizzle_r == GL_ONE ? 1.0 : 0.0, - tview->gl_swizzle_g == GL_ONE ? 1.0 : 0.0, - tview->gl_swizzle_b == GL_ONE ? 1.0 : 0.0, - tview->gl_swizzle_a == GL_ONE ? 1.0 : 0.0); + glBindTexture(target, id); + if (ctx->sub->views[shader_type].old_ids[i] != id || ctx->sub->sampler_state_dirty) { + vrend_apply_sampler_state(ctx, texture, shader_type, i, *sampler_id, ctx->sub->views[shader_type].views[i]->srgb_decode); + ctx->sub->views[shader_type].old_ids[i] = id; } - - glActiveTexture(GL_TEXTURE0 + sampler_id); - if (texture) { - GLuint id; - GLenum target = texture->target; - - if (texture->is_buffer) { - id = texture->tbo_tex_id; - target = GL_TEXTURE_BUFFER; - } else - id = texture->id; - - glBindTexture(target, id); - if (ctx->sub->views[shader_type].old_ids[i] != id || ctx->sub->sampler_state_dirty) { - vrend_apply_sampler_state(ctx, texture, shader_type, i, sampler_id, ctx->sub->views[shader_type].views[i]->srgb_decode); - ctx->sub->views[shader_type].old_ids[i] = id; - } - if (ctx->sub->rs_state.point_quad_rasterization) { - if (vrend_state.use_core_profile == false) { - if (ctx->sub->rs_state.sprite_coord_enable & (1 << i)) - glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE); - else - glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_FALSE); - } + if (ctx->sub->rs_state.point_quad_rasterization) { + if (vrend_state.use_core_profile == false) { + if (ctx->sub->rs_state.sprite_coord_enable & (1 << i)) + glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE); + else + glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_FALSE); } - sampler_id++; } - index++; + (*sampler_id)++; } + index++; + } +} + +static void vrend_draw_bind_samplers(struct vrend_context *ctx) +{ + int sampler_id; + int shader_type; + + sampler_id = 0; + for (shader_type = PIPE_SHADER_VERTEX; shader_type <= ctx->sub->last_shader_idx; shader_type++) { + vrend_draw_bind_samplers_shader(ctx, shader_type, &sampler_id); } if (vrend_state.use_core_profile && ctx->sub->prog->fs_stipple_loc != -1) {