aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2017-06-05 01:08:41 +0200
committerMarek Olšák <[email protected]>2017-06-07 18:46:21 +0200
commitf34abf77e90355739038d0bab0d80b54eb4e5246 (patch)
treec2cdabcd5dba74f60bc9c33bfde643a08ad493e7
parentf7523f1ef6709fba0d8ee79eddcb501f30ee628d (diff)
st/mesa: cache pipe_surface for GL_FRAMEBUFFER_SRGB changes
Reviewed-by: Samuel Pitoiset <[email protected]> Reviewed-by: Nicolai Hähnle <[email protected]>
-rw-r--r--src/mesa/state_tracker/st_cb_eglimage.c7
-rw-r--r--src/mesa/state_tracker/st_cb_fbo.c49
-rw-r--r--src/mesa/state_tracker/st_cb_fbo.h7
-rw-r--r--src/mesa/state_tracker/st_manager.c7
4 files changed, 41 insertions, 29 deletions
diff --git a/src/mesa/state_tracker/st_cb_eglimage.c b/src/mesa/state_tracker/st_cb_eglimage.c
index a104b649eae..0f649f4ab43 100644
--- a/src/mesa/state_tracker/st_cb_eglimage.c
+++ b/src/mesa/state_tracker/st_cb_eglimage.c
@@ -158,7 +158,12 @@ st_egl_image_target_renderbuffer_storage(struct gl_context *ctx,
strb->Base._BaseFormat = st_pipe_format_to_base_format(ps->format);
strb->Base.InternalFormat = strb->Base._BaseFormat;
- pipe_surface_reference(&strb->surface, ps);
+ struct pipe_surface **psurf =
+ util_format_is_srgb(ps->format) ? &strb->surface_srgb :
+ &strb->surface_linear;
+
+ pipe_surface_reference(psurf, ps);
+ strb->surface = *psurf;
pipe_resource_reference(&strb->texture, ps->texture);
pipe_surface_reference(&ps, NULL);
diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
index f9082255a8b..ac8d66588e0 100644
--- a/src/mesa/state_tracker/st_cb_fbo.c
+++ b/src/mesa/state_tracker/st_cb_fbo.c
@@ -112,11 +112,9 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx,
GLuint width, GLuint height)
{
struct st_context *st = st_context(ctx);
- struct pipe_context *pipe = st->pipe;
struct pipe_screen *screen = st->pipe->screen;
struct st_renderbuffer *strb = st_renderbuffer(rb);
enum pipe_format format = PIPE_FORMAT_NONE;
- struct pipe_surface surf_tmpl;
struct pipe_resource templ;
/* init renderbuffer fields */
@@ -132,7 +130,9 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx,
/* Free the old surface and texture
*/
- pipe_surface_reference( &strb->surface, NULL );
+ pipe_surface_reference(&strb->surface_srgb, NULL);
+ pipe_surface_reference(&strb->surface_linear, NULL);
+ strb->surface = NULL;
pipe_resource_reference( &strb->texture, NULL );
/* If an sRGB framebuffer is unsupported, sRGB formats behave like linear
@@ -215,17 +215,7 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx,
if (!strb->texture)
return FALSE;
- u_surface_default_template(&surf_tmpl, strb->texture);
- strb->surface = pipe->create_surface(pipe,
- strb->texture,
- &surf_tmpl);
- if (strb->surface) {
- assert(strb->surface->texture);
- assert(strb->surface->format);
- assert(strb->surface->width == width);
- assert(strb->surface->height == height);
- }
-
+ st_update_renderbuffer_surface(st, strb);
return strb->surface != NULL;
}
@@ -239,7 +229,9 @@ st_renderbuffer_delete(struct gl_context *ctx, struct gl_renderbuffer *rb)
struct st_renderbuffer *strb = st_renderbuffer(rb);
if (ctx) {
struct st_context *st = st_context(ctx);
- pipe_surface_release(st->pipe, &strb->surface);
+ pipe_surface_release(st->pipe, &strb->surface_srgb);
+ pipe_surface_release(st->pipe, &strb->surface_linear);
+ strb->surface = NULL;
}
pipe_resource_reference(&strb->texture, NULL);
free(strb->data);
@@ -450,15 +442,19 @@ st_update_renderbuffer_surface(struct st_context *st,
last_layer = MIN2(first_layer + tex->NumLayers - 1, last_layer);
}
- if (!strb->surface ||
- strb->surface->texture->nr_samples != strb->Base.NumSamples ||
- strb->surface->format != format ||
- strb->surface->texture != resource ||
- strb->surface->width != rtt_width ||
- strb->surface->height != rtt_height ||
- strb->surface->u.tex.level != level ||
- strb->surface->u.tex.first_layer != first_layer ||
- strb->surface->u.tex.last_layer != last_layer) {
+ struct pipe_surface **psurf =
+ enable_srgb ? &strb->surface_srgb : &strb->surface_linear;
+ struct pipe_surface *surf = *psurf;
+
+ if (!surf ||
+ surf->texture->nr_samples != strb->Base.NumSamples ||
+ surf->format != format ||
+ surf->texture != resource ||
+ surf->width != rtt_width ||
+ surf->height != rtt_height ||
+ surf->u.tex.level != level ||
+ surf->u.tex.first_layer != first_layer ||
+ surf->u.tex.last_layer != last_layer) {
/* create a new pipe_surface */
struct pipe_surface surf_tmpl;
memset(&surf_tmpl, 0, sizeof(surf_tmpl));
@@ -467,10 +463,11 @@ st_update_renderbuffer_surface(struct st_context *st,
surf_tmpl.u.tex.first_layer = first_layer;
surf_tmpl.u.tex.last_layer = last_layer;
- pipe_surface_release(pipe, &strb->surface);
+ pipe_surface_release(pipe, psurf);
- strb->surface = pipe->create_surface(pipe, resource, &surf_tmpl);
+ *psurf = pipe->create_surface(pipe, resource, &surf_tmpl);
}
+ strb->surface = *psurf;
}
/**
diff --git a/src/mesa/state_tracker/st_cb_fbo.h b/src/mesa/state_tracker/st_cb_fbo.h
index 351fb9a02ef..239bfd95e96 100644
--- a/src/mesa/state_tracker/st_cb_fbo.h
+++ b/src/mesa/state_tracker/st_cb_fbo.h
@@ -48,7 +48,12 @@ struct st_renderbuffer
{
struct gl_renderbuffer Base;
struct pipe_resource *texture;
- struct pipe_surface *surface; /* temporary view into texture */
+ /* This points to either "surface_linear" or "surface_srgb".
+ * It doesn't hold the pipe_surface reference. The other two do.
+ */
+ struct pipe_surface *surface;
+ struct pipe_surface *surface_linear;
+ struct pipe_surface *surface_srgb;
GLboolean defined; /**< defined contents? */
struct pipe_transfer *transfer; /**< only used when mapping the resource */
diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c
index cc781f46209..d0f32ff0f63 100644
--- a/src/mesa/state_tracker/st_manager.c
+++ b/src/mesa/state_tracker/st_manager.c
@@ -217,7 +217,12 @@ st_framebuffer_validate(struct st_framebuffer *stfb,
u_surface_default_template(&surf_tmpl, textures[i]);
ps = st->pipe->create_surface(st->pipe, textures[i], &surf_tmpl);
if (ps) {
- pipe_surface_reference(&strb->surface, ps);
+ struct pipe_surface **psurf =
+ util_format_is_srgb(ps->format) ? &strb->surface_srgb :
+ &strb->surface_linear;
+
+ pipe_surface_reference(psurf, ps);
+ strb->surface = *psurf;
pipe_resource_reference(&strb->texture, ps->texture);
/* ownership transfered */
pipe_surface_reference(&ps, NULL);