st/mesa: cache pipe_surface for GL_FRAMEBUFFER_SRGB changes
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
parent
f7523f1ef6
commit
f34abf77e9
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue