For both, Reviewed-by: Brian Paul <bri...@vmware.com> On 01/08/2019 08:57 AM, Marek Olšák wrote: > From: Marek Olšák <marek.ol...@amd.com> > > --- > src/mesa/state_tracker/st_cb_eglimage.c | 11 +-------- > src/mesa/state_tracker/st_manager.c | 32 ++++++++++++++++--------- > src/mesa/state_tracker/st_manager.h | 6 +++++ > 3 files changed, 28 insertions(+), 21 deletions(-) > > diff --git a/src/mesa/state_tracker/st_cb_eglimage.c > b/src/mesa/state_tracker/st_cb_eglimage.c > index d6b93c3dbe8..f79df5a38ca 100644 > --- a/src/mesa/state_tracker/st_cb_eglimage.c > +++ b/src/mesa/state_tracker/st_cb_eglimage.c > @@ -152,34 +152,25 @@ st_egl_image_target_renderbuffer_storage(struct > gl_context *ctx, > surf_tmpl.format = stimg.format; > surf_tmpl.u.tex.level = stimg.level; > surf_tmpl.u.tex.first_layer = stimg.layer; > surf_tmpl.u.tex.last_layer = stimg.layer; > ps = pipe->create_surface(pipe, stimg.texture, &surf_tmpl); > pipe_resource_reference(&stimg.texture, NULL); > > if (!ps) > return; > > - strb->Base.Width = ps->width; > - strb->Base.Height = ps->height; > strb->Base.Format = st_pipe_format_to_mesa_format(ps->format); > strb->Base._BaseFormat = st_pipe_format_to_base_format(ps->format); > strb->Base.InternalFormat = strb->Base._BaseFormat; > > - 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); > - > + st_set_ws_renderbuffer_surface(strb, ps); > pipe_surface_reference(&ps, NULL); > } > } > > static void > st_bind_egl_image(struct gl_context *ctx, > struct gl_texture_object *texObj, > struct gl_texture_image *texImage, > struct st_egl_image *stimg) > { > diff --git a/src/mesa/state_tracker/st_manager.c > b/src/mesa/state_tracker/st_manager.c > index 73729d74545..7a3d9777101 100644 > --- a/src/mesa/state_tracker/st_manager.c > +++ b/src/mesa/state_tracker/st_manager.c > @@ -166,20 +166,40 @@ st_context_validate(struct st_context *st, > st->dirty |= ST_NEW_FRAMEBUFFER; > _mesa_resize_framebuffer(st->ctx, &stread->Base, > stread->Base.Width, > stread->Base.Height); > } > st->read_stamp = stread->stamp; > } > } > > > +void > +st_set_ws_renderbuffer_surface(struct st_renderbuffer *strb, > + struct pipe_surface *surf) > +{ > + pipe_surface_reference(&strb->surface_srgb, NULL); > + pipe_surface_reference(&strb->surface_linear, NULL); > + > + if (util_format_is_srgb(surf->format)) > + pipe_surface_reference(&strb->surface_srgb, surf); > + else > + pipe_surface_reference(&strb->surface_linear, surf); > + > + strb->surface = surf; /* just assign, don't ref */ > + pipe_resource_reference(&strb->texture, surf->texture); > + > + strb->Base.Width = surf->width; > + strb->Base.Height = surf->height; > +} > + > + > /** > * Validate a framebuffer to make sure up-to-date pipe_textures are used. > * The context is only used for creating pipe surfaces and for calling > * _mesa_resize_framebuffer(). > * (That should probably be rethought, since those surfaces become > * drawable state, not context state, and can be freed by another pipe > * context). > */ > static void > st_framebuffer_validate(struct st_framebuffer *stfb, > @@ -227,35 +247,25 @@ st_framebuffer_validate(struct st_framebuffer *stfb, > strb = st_renderbuffer(stfb->Base.Attachment[idx].Renderbuffer); > assert(strb); > if (strb->texture == textures[i]) { > pipe_resource_reference(&textures[i], NULL); > continue; > } > > u_surface_default_template(&surf_tmpl, textures[i]); > ps = st->pipe->create_surface(st->pipe, textures[i], &surf_tmpl); > if (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 */ > + st_set_ws_renderbuffer_surface(strb, ps); > pipe_surface_reference(&ps, NULL); > > changed = TRUE; > > - strb->Base.Width = strb->surface->width; > - strb->Base.Height = strb->surface->height; > - > width = strb->Base.Width; > height = strb->Base.Height; > } > > pipe_resource_reference(&textures[i], NULL); > } > > if (changed) { > ++stfb->stamp; > _mesa_resize_framebuffer(st->ctx, &stfb->Base, width, height); > diff --git a/src/mesa/state_tracker/st_manager.h > b/src/mesa/state_tracker/st_manager.h > index 162dcc2ca57..581e858229b 100644 > --- a/src/mesa/state_tracker/st_manager.h > +++ b/src/mesa/state_tracker/st_manager.h > @@ -28,20 +28,22 @@ > #ifndef ST_MANAGER_H > #define ST_MANAGER_H > > #include "main/menums.h" > > #include "pipe/p_compiler.h" > > struct st_context; > struct st_framebuffer; > struct st_framebuffer_interface; > +struct st_renderbuffer; > +struct pipe_surface; > > void > st_manager_flush_frontbuffer(struct st_context *st); > > void > st_manager_validate_framebuffers(struct st_context *st); > > boolean > st_manager_add_color_renderbuffer(struct st_context *st, struct > gl_framebuffer *fb, > gl_buffer_index idx); > @@ -49,11 +51,15 @@ st_manager_add_color_renderbuffer(struct st_context *st, > struct gl_framebuffer * > void > st_framebuffer_reference(struct st_framebuffer **ptr, > struct st_framebuffer *stfb); > > void > st_framebuffer_interface_destroy(struct st_framebuffer_interface *stfbi); > > void > st_manager_flush_swapbuffers(void); > > +void > +st_set_ws_renderbuffer_surface(struct st_renderbuffer *strb, > + struct pipe_surface *surf); > + > #endif /* ST_MANAGER_H */ >
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev