[virglrenderer-devel] [PATCH] vrend: update texture state on a per view base
Gert Wollny
gert.wollny at collabora.com
Fri Jul 6 09:35:49 UTC 2018
When a texture is bound in its original form then the swizzle states and
the sRGB state were updated and if a texture view of this texture was bound
later it was assumed that the state is already submitted. However, it seems
that a texture view has its own, separate state that must be set separately,
so keep track of it on a per-view basis.
Signed-off-by: Gert Wollny <gert.wollny at collabora.com>
---
src/vrend_renderer.c | 34 ++++++++++++++++++----------------
1 file changed, 18 insertions(+), 16 deletions(-)
diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index 23494a8..7bb5d83 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -197,11 +197,6 @@ struct vrend_shader_selector {
struct vrend_texture {
struct vrend_resource base;
struct pipe_sampler_state state;
- GLenum cur_swizzle_r;
- GLenum cur_swizzle_g;
- GLenum cur_swizzle_b;
- GLenum cur_swizzle_a;
- GLuint srgb_decode;
};
struct vrend_surface {
@@ -237,9 +232,14 @@ struct vrend_sampler_view {
GLuint gl_swizzle_g;
GLuint gl_swizzle_b;
GLuint gl_swizzle_a;
+ GLenum cur_swizzle_r;
+ GLenum cur_swizzle_g;
+ GLenum cur_swizzle_b;
+ GLenum cur_swizzle_a;
GLuint cur_base, cur_max;
GLenum depth_texture_mode;
GLuint srgb_decode;
+ GLuint cur_srgb_decode;
struct vrend_resource *texture;
};
@@ -1540,6 +1540,9 @@ int vrend_create_sampler_view(struct vrend_context *ctx,
view->gl_swizzle_b = to_gl_swizzle(swizzle[2]);
view->gl_swizzle_a = to_gl_swizzle(swizzle[3]);
+ view->cur_swizzle_r = view->cur_swizzle_g =
+ view->cur_swizzle_b = view->cur_swizzle_a = -1;
+
ret_handle = vrend_renderer_object_insert(ctx, view, sizeof(*view), handle, VIRGL_OBJECT_SAMPLER_VIEW);
if (ret_handle == 0) {
FREE(view);
@@ -2189,29 +2192,29 @@ void vrend_set_single_sampler_view(struct vrend_context *ctx,
view->cur_max = (view->val1 >> 8) & 0xff;
glTexParameteri(view->texture->target, GL_TEXTURE_MAX_LEVEL, view->cur_max);
}
- if (tex->cur_swizzle_r != view->gl_swizzle_r) {
+ if (view->cur_swizzle_r != view->gl_swizzle_r) {
glTexParameteri(view->texture->target, GL_TEXTURE_SWIZZLE_R, view->gl_swizzle_r);
- tex->cur_swizzle_r = view->gl_swizzle_r;
+ view->cur_swizzle_r = view->gl_swizzle_r;
}
- if (tex->cur_swizzle_g != view->gl_swizzle_g) {
+ if (view->cur_swizzle_g != view->gl_swizzle_g) {
glTexParameteri(view->texture->target, GL_TEXTURE_SWIZZLE_G, view->gl_swizzle_g);
- tex->cur_swizzle_g = view->gl_swizzle_g;
+ view->cur_swizzle_g = view->gl_swizzle_g;
}
- if (tex->cur_swizzle_b != view->gl_swizzle_b) {
+ if (view->cur_swizzle_b != view->gl_swizzle_b) {
glTexParameteri(view->texture->target, GL_TEXTURE_SWIZZLE_B, view->gl_swizzle_b);
- tex->cur_swizzle_b = view->gl_swizzle_b;
+ view->cur_swizzle_b = view->gl_swizzle_b;
}
- if (tex->cur_swizzle_a != view->gl_swizzle_a) {
+ if (view->cur_swizzle_a != view->gl_swizzle_a) {
glTexParameteri(view->texture->target, GL_TEXTURE_SWIZZLE_A, view->gl_swizzle_a);
- tex->cur_swizzle_a = view->gl_swizzle_a;
+ view->cur_swizzle_a = view->gl_swizzle_a;
}
- if (tex->srgb_decode != view->srgb_decode && util_format_is_srgb(tex->base.base.format)) {
+ if (view->cur_srgb_decode != view->srgb_decode && util_format_is_srgb(view->format)) {
if (vrend_state.have_samplers)
ctx->sub->sampler_state_dirty = true;
else {
glTexParameteri(view->texture->target, GL_TEXTURE_SRGB_DECODE_EXT,
view->srgb_decode);
- tex->srgb_decode = view->srgb_decode;
+ view->cur_srgb_decode = view->srgb_decode;
}
}
} else {
@@ -5018,7 +5021,6 @@ static int vrend_renderer_resource_allocate_texture(struct vrend_resource *gr,
}
gt->state.max_lod = -1;
- gt->cur_swizzle_r = gt->cur_swizzle_g = gt->cur_swizzle_b = gt->cur_swizzle_a = -1;
return 0;
}
--
2.16.4
More information about the virglrenderer-devel
mailing list