From 2eb45daa9c86f4b8bd602ddef7a67233f56f1edf Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 14 Mar 2025 14:33:53 -0400 Subject: [PATCH] gallium: de-pointerize pipe_surface this allows eliminating surface refcounting and objects which, relatively speaking, don't serve much purpose see MR for details Signed-off-by: Alyssa Rosenzweig Part-of: --- src/gallium/auxiliary/driver_ddebug/dd_draw.c | 12 +- .../auxiliary/driver_trace/tr_context.c | 9 +- src/gallium/auxiliary/driver_trace/tr_dump.h | 7 + .../auxiliary/driver_trace/tr_dump_state.c | 14 +- src/gallium/auxiliary/driver_trace/tr_video.c | 30 ++-- src/gallium/auxiliary/driver_trace/tr_video.h | 1 - src/gallium/auxiliary/hud/hud_context.c | 8 +- src/gallium/auxiliary/postprocess/pp_init.c | 20 +-- src/gallium/auxiliary/postprocess/pp_mlaa.c | 4 +- .../auxiliary/postprocess/pp_private.h | 2 +- src/gallium/auxiliary/postprocess/pp_run.c | 6 +- src/gallium/auxiliary/util/u_blitter.c | 90 ++++------- src/gallium/auxiliary/util/u_dump_state.c | 18 ++- src/gallium/auxiliary/util/u_framebuffer.c | 125 ++++++++------ src/gallium/auxiliary/util/u_framebuffer.h | 11 ++ src/gallium/auxiliary/util/u_inlines.h | 6 +- src/gallium/auxiliary/util/u_surface.c | 1 + src/gallium/auxiliary/util/u_tests.c | 7 +- .../auxiliary/util/u_threaded_context.c | 38 ++--- src/gallium/auxiliary/util/u_trace_gallium.c | 8 +- src/gallium/auxiliary/vl/vl_bicubic_filter.c | 2 +- src/gallium/auxiliary/vl/vl_compositor.c | 34 ++-- src/gallium/auxiliary/vl/vl_compositor_cs.c | 6 +- src/gallium/auxiliary/vl/vl_compositor_gfx.c | 2 +- src/gallium/auxiliary/vl/vl_deint_filter.c | 10 +- src/gallium/auxiliary/vl/vl_deint_filter_cs.c | 4 +- src/gallium/auxiliary/vl/vl_idct.c | 23 +-- src/gallium/auxiliary/vl/vl_matrix_filter.c | 2 +- src/gallium/auxiliary/vl/vl_mc.c | 4 +- src/gallium/auxiliary/vl/vl_median_filter.c | 2 +- src/gallium/auxiliary/vl/vl_mpeg12_decoder.c | 14 +- src/gallium/auxiliary/vl/vl_video_buffer.c | 44 ++--- src/gallium/auxiliary/vl/vl_video_buffer.h | 2 +- src/gallium/auxiliary/vl/vl_zscan.c | 4 +- src/gallium/drivers/asahi/agx_batch.c | 8 +- src/gallium/drivers/asahi/agx_pipe.c | 18 +-- src/gallium/drivers/asahi/agx_state.c | 67 ++++---- src/gallium/drivers/crocus/crocus_clear.c | 4 +- src/gallium/drivers/crocus/crocus_context.c | 3 + src/gallium/drivers/crocus/crocus_context.h | 2 + src/gallium/drivers/crocus/crocus_program.c | 4 +- src/gallium/drivers/crocus/crocus_resolve.c | 16 +- src/gallium/drivers/crocus/crocus_state.c | 57 +++---- src/gallium/drivers/d3d12/d3d12_blit.cpp | 20 +-- src/gallium/drivers/d3d12/d3d12_compiler.cpp | 2 +- src/gallium/drivers/d3d12/d3d12_context.h | 2 + .../drivers/d3d12/d3d12_context_common.cpp | 1 + .../drivers/d3d12/d3d12_context_graphics.cpp | 36 +++-- src/gallium/drivers/d3d12/d3d12_draw.cpp | 24 +-- .../drivers/d3d12/d3d12_video_buffer.cpp | 41 ++--- .../drivers/d3d12/d3d12_video_buffer.h | 5 +- src/gallium/drivers/etnaviv/etnaviv_blend.c | 10 +- src/gallium/drivers/etnaviv/etnaviv_blt.c | 8 +- src/gallium/drivers/etnaviv/etnaviv_context.c | 21 +-- src/gallium/drivers/etnaviv/etnaviv_context.h | 3 + src/gallium/drivers/etnaviv/etnaviv_rs.c | 14 +- src/gallium/drivers/etnaviv/etnaviv_state.c | 30 ++-- src/gallium/drivers/etnaviv/etnaviv_state.h | 2 +- src/gallium/drivers/freedreno/a2xx/fd2_draw.c | 10 +- src/gallium/drivers/freedreno/a2xx/fd2_gmem.c | 32 ++-- src/gallium/drivers/freedreno/a3xx/fd3_emit.c | 28 ++-- src/gallium/drivers/freedreno/a3xx/fd3_emit.h | 2 +- src/gallium/drivers/freedreno/a3xx/fd3_gmem.c | 48 +++--- .../drivers/freedreno/a3xx/fd3_program.c | 6 +- .../drivers/freedreno/a3xx/fd3_program.h | 2 +- src/gallium/drivers/freedreno/a4xx/fd4_emit.c | 28 ++-- src/gallium/drivers/freedreno/a4xx/fd4_emit.h | 4 +- src/gallium/drivers/freedreno/a4xx/fd4_gmem.c | 40 ++--- .../drivers/freedreno/a4xx/fd4_program.c | 12 +- .../drivers/freedreno/a4xx/fd4_program.h | 2 +- src/gallium/drivers/freedreno/a5xx/fd5_draw.c | 14 +- src/gallium/drivers/freedreno/a5xx/fd5_emit.c | 10 +- src/gallium/drivers/freedreno/a5xx/fd5_gmem.c | 38 ++--- .../drivers/freedreno/a6xx/fd6_blitter.cc | 8 +- .../drivers/freedreno/a6xx/fd6_context.cc | 10 +- .../drivers/freedreno/a6xx/fd6_draw.cc | 8 +- .../drivers/freedreno/a6xx/fd6_emit.cc | 8 +- .../drivers/freedreno/a6xx/fd6_gmem.cc | 90 +++++------ .../drivers/freedreno/freedreno_autotune.c | 2 +- .../drivers/freedreno/freedreno_batch.c | 4 +- .../drivers/freedreno/freedreno_batch_cache.c | 12 +- .../drivers/freedreno/freedreno_draw.c | 32 ++-- .../drivers/freedreno/freedreno_gmem.c | 28 ++-- .../drivers/freedreno/freedreno_resource.c | 4 +- .../drivers/freedreno/freedreno_state.c | 6 +- .../drivers/freedreno/freedreno_surface.c | 7 +- .../drivers/freedreno/freedreno_surface.h | 10 -- .../drivers/freedreno/freedreno_util.h | 2 +- src/gallium/drivers/i915/i915_clear.c | 12 +- src/gallium/drivers/i915/i915_context.c | 1 + src/gallium/drivers/i915/i915_context.h | 2 + src/gallium/drivers/i915/i915_state.c | 7 +- src/gallium/drivers/i915/i915_state_dynamic.c | 2 +- src/gallium/drivers/i915/i915_state_emit.c | 2 +- .../drivers/i915/i915_state_immediate.c | 4 +- src/gallium/drivers/i915/i915_state_static.c | 8 +- src/gallium/drivers/i915/i915_surface.c | 7 +- src/gallium/drivers/iris/iris_clear.c | 4 +- src/gallium/drivers/iris/iris_context.c | 3 + src/gallium/drivers/iris/iris_context.h | 2 + src/gallium/drivers/iris/iris_resolve.c | 16 +- src/gallium/drivers/iris/iris_state.c | 55 +++---- src/gallium/drivers/lima/lima_context.c | 1 + src/gallium/drivers/lima/lima_context.h | 2 + src/gallium/drivers/lima/lima_draw.c | 12 +- src/gallium/drivers/lima/lima_job.c | 2 +- src/gallium/drivers/lima/lima_resource.c | 12 +- src/gallium/drivers/lima/lima_state.c | 1 + src/gallium/drivers/llvmpipe/lp_flush.c | 4 +- src/gallium/drivers/llvmpipe/lp_rast.c | 18 +-- src/gallium/drivers/llvmpipe/lp_rast_priv.h | 6 +- src/gallium/drivers/llvmpipe/lp_scene.c | 28 ++-- src/gallium/drivers/llvmpipe/lp_setup.c | 16 +- src/gallium/drivers/llvmpipe/lp_setup_rect.c | 2 +- .../drivers/llvmpipe/lp_state_derived.c | 16 +- src/gallium/drivers/llvmpipe/lp_state_fs.c | 20 +-- .../drivers/llvmpipe/lp_state_surface.c | 19 +-- src/gallium/drivers/llvmpipe/lp_surface.c | 4 + src/gallium/drivers/nouveau/nouveau_video.c | 22 +-- src/gallium/drivers/nouveau/nouveau_video.h | 2 +- .../drivers/nouveau/nouveau_vp3_video.c | 15 +- .../drivers/nouveau/nouveau_vp3_video.h | 2 +- src/gallium/drivers/nouveau/nv30/nv30_clear.c | 6 +- .../drivers/nouveau/nv30/nv30_context.c | 9 +- .../drivers/nouveau/nv30/nv30_context.h | 2 + src/gallium/drivers/nouveau/nv30/nv30_state.c | 16 +- .../nouveau/nv30/nv30_state_validate.c | 32 ++-- .../drivers/nouveau/nv50/nv50_context.c | 7 +- .../drivers/nouveau/nv50/nv50_context.h | 2 + .../drivers/nouveau/nv50/nv50_shader_state.c | 10 +- src/gallium/drivers/nouveau/nv50/nv50_state.c | 1 + .../nouveau/nv50/nv50_state_validate.c | 16 +- .../drivers/nouveau/nv50/nv50_surface.c | 25 +-- src/gallium/drivers/nouveau/nv50/nv84_video.c | 17 +- src/gallium/drivers/nouveau/nv50/nv84_video.h | 2 +- .../drivers/nouveau/nvc0/nvc0_context.c | 7 +- .../drivers/nouveau/nvc0/nvc0_context.h | 2 + src/gallium/drivers/nouveau/nvc0/nvc0_state.c | 1 + .../nouveau/nvc0/nvc0_state_validate.c | 24 +-- .../drivers/nouveau/nvc0/nvc0_surface.c | 30 ++-- src/gallium/drivers/panfrost/pan_blit.c | 2 + src/gallium/drivers/panfrost/pan_cmdstream.c | 22 +-- src/gallium/drivers/panfrost/pan_cmdstream.h | 4 +- src/gallium/drivers/panfrost/pan_context.c | 4 +- src/gallium/drivers/panfrost/pan_helpers.c | 2 +- src/gallium/drivers/panfrost/pan_job.c | 30 ++-- src/gallium/drivers/panfrost/pan_resource.c | 6 +- src/gallium/drivers/panfrost/pan_shader.c | 4 +- src/gallium/drivers/r300/r300_blit.c | 40 ++--- src/gallium/drivers/r300/r300_context.c | 1 + src/gallium/drivers/r300/r300_context.h | 13 +- src/gallium/drivers/r300/r300_emit.c | 40 ++--- src/gallium/drivers/r300/r300_hyperz.c | 5 +- src/gallium/drivers/r300/r300_state.c | 40 ++--- src/gallium/drivers/r600/evergreen_compute.c | 8 +- src/gallium/drivers/r600/evergreen_state.c | 33 ++-- src/gallium/drivers/r600/r600_blit.c | 142 ++++++++++++++-- src/gallium/drivers/r600/r600_pipe.c | 1 + src/gallium/drivers/r600/r600_pipe.h | 2 + src/gallium/drivers/r600/r600_pipe_common.h | 7 +- src/gallium/drivers/r600/r600_state.c | 37 ++--- src/gallium/drivers/r600/r600_state_common.c | 6 +- src/gallium/drivers/r600/r600_texture.c | 127 +-------------- src/gallium/drivers/radeonsi/si_barrier.c | 12 +- src/gallium/drivers/radeonsi/si_blit.c | 23 ++- src/gallium/drivers/radeonsi/si_clear.c | 77 +++++---- src/gallium/drivers/radeonsi/si_debug.c | 8 +- src/gallium/drivers/radeonsi/si_descriptors.c | 35 ++-- src/gallium/drivers/radeonsi/si_gfx_cs.c | 2 +- src/gallium/drivers/radeonsi/si_pipe.c | 1 + src/gallium/drivers/radeonsi/si_pipe.h | 1 + src/gallium/drivers/radeonsi/si_state.c | 110 +++++++------ .../drivers/radeonsi/si_state_binning.c | 16 +- .../drivers/radeonsi/si_state_draw.cpp | 6 +- .../drivers/radeonsi/si_state_shaders.cpp | 4 +- .../drivers/radeonsi/si_test_blit_perf.c | 21 ++- src/gallium/drivers/radeonsi/si_vpe.c | 66 +++----- src/gallium/drivers/radeonsi/si_vpe.h | 4 +- src/gallium/drivers/softpipe/sp_clear.c | 2 +- src/gallium/drivers/softpipe/sp_context.c | 6 +- src/gallium/drivers/softpipe/sp_quad_blend.c | 8 +- .../drivers/softpipe/sp_quad_depth_test.c | 10 +- src/gallium/drivers/softpipe/sp_quad_pipe.c | 3 +- src/gallium/drivers/softpipe/sp_setup.c | 4 +- .../drivers/softpipe/sp_state_surface.c | 28 +--- src/gallium/drivers/softpipe/sp_surface.c | 13 ++ src/gallium/drivers/softpipe/sp_tile_cache.c | 27 +--- src/gallium/drivers/softpipe/sp_tile_cache.h | 8 +- src/gallium/drivers/svga/svga_context.c | 4 + src/gallium/drivers/svga/svga_context.h | 3 + src/gallium/drivers/svga/svga_draw.c | 4 +- src/gallium/drivers/svga/svga_format.c | 4 +- src/gallium/drivers/svga/svga_pipe_blit.c | 2 +- src/gallium/drivers/svga/svga_pipe_clear.c | 20 +-- src/gallium/drivers/svga/svga_pipe_flush.c | 6 +- src/gallium/drivers/svga/svga_pipe_misc.c | 16 +- .../drivers/svga/svga_state_framebuffer.c | 91 +++++------ src/gallium/drivers/svga/svga_state_rss.c | 8 +- src/gallium/drivers/svga/svga_state_sampler.c | 4 +- src/gallium/drivers/svga/svga_surface.c | 13 +- src/gallium/drivers/svga/svga_swtnl_state.c | 4 +- src/gallium/drivers/tegra/tegra_context.c | 16 -- src/gallium/drivers/v3d/v3d_context.c | 5 +- src/gallium/drivers/v3d/v3d_context.h | 2 + src/gallium/drivers/v3d/v3d_job.c | 5 +- src/gallium/drivers/v3d/v3d_program.c | 4 +- src/gallium/drivers/v3d/v3dx_draw.c | 4 +- src/gallium/drivers/v3d/v3dx_state.c | 5 +- src/gallium/drivers/vc4/vc4_context.c | 1 + src/gallium/drivers/vc4/vc4_context.h | 2 + src/gallium/drivers/vc4/vc4_draw.c | 16 +- src/gallium/drivers/vc4/vc4_job.c | 5 +- src/gallium/drivers/vc4/vc4_program.c | 4 +- src/gallium/drivers/vc4/vc4_state.c | 13 +- src/gallium/drivers/vc4/vc4_uniforms.c | 2 +- src/gallium/drivers/virgl/virgl_context.c | 27 ++-- src/gallium/drivers/virgl/virgl_context.h | 2 + src/gallium/drivers/virgl/virgl_encode.c | 4 +- .../zink/ci/zink-radv-vangogh-fails.txt | 3 + src/gallium/drivers/zink/zink_blit.c | 2 +- src/gallium/drivers/zink/zink_clear.c | 88 +++++----- src/gallium/drivers/zink/zink_context.c | 152 ++++++++++-------- src/gallium/drivers/zink/zink_draw.cpp | 4 +- src/gallium/drivers/zink/zink_framebuffer.c | 20 +-- src/gallium/drivers/zink/zink_kopper.c | 14 +- src/gallium/drivers/zink/zink_render_pass.c | 68 ++++---- src/gallium/drivers/zink/zink_types.h | 1 + src/gallium/frontends/lavapipe/lvp_execute.c | 16 +- src/gallium/frontends/nine/nine_state.c | 10 +- src/gallium/frontends/nine/surface9.c | 24 +-- src/gallium/frontends/nine/surface9.h | 5 +- src/gallium/frontends/va/postproc.c | 6 +- src/gallium/frontends/va/surface.c | 18 +-- src/gallium/frontends/vdpau/surface.c | 10 +- src/gallium/frontends/xa/xa_composite.c | 6 +- src/gallium/frontends/xa/xa_context.c | 22 +-- src/gallium/frontends/xa/xa_priv.h | 6 +- src/gallium/frontends/xa/xa_renderer.c | 22 ++- src/gallium/frontends/xa/xa_yuv.c | 2 +- src/gallium/include/pipe/p_state.h | 99 ++++++------ src/gallium/include/pipe/p_video_codec.h | 2 +- src/intel/ci/iris-kbl-fails.txt | 20 +-- src/mesa/main/blit.c | 105 ++++-------- src/mesa/main/mtypes.h | 5 +- src/mesa/main/renderbuffer.c | 103 +++--------- src/mesa/main/renderbuffer.h | 6 - src/mesa/state_tracker/st_atom_framebuffer.c | 45 +++--- src/mesa/state_tracker/st_cb_clear.c | 12 +- src/mesa/state_tracker/st_cb_drawpixels.c | 28 ++-- src/mesa/state_tracker/st_cb_eglimage.c | 17 +- src/mesa/state_tracker/st_cb_readpixels.c | 9 +- src/mesa/state_tracker/st_cb_texture.c | 72 +++------ src/mesa/state_tracker/st_manager.c | 21 +-- src/panfrost/ci/panfrost-g57-fails.txt | 1 - 254 files changed, 2086 insertions(+), 2338 deletions(-) diff --git a/src/gallium/auxiliary/driver_ddebug/dd_draw.c b/src/gallium/auxiliary/driver_ddebug/dd_draw.c index b13b941c4b1..1f02c57b251 100644 --- a/src/gallium/auxiliary/driver_ddebug/dd_draw.c +++ b/src/gallium/auxiliary/driver_ddebug/dd_draw.c @@ -423,17 +423,17 @@ dd_dump_draw_vbo(struct dd_draw_state *dstate, struct pipe_draw_info *info, DUMP(framebuffer_state, &dstate->framebuffer_state); for (i = 0; i < dstate->framebuffer_state.nr_cbufs; i++) - if (dstate->framebuffer_state.cbufs[i]) { + if (dstate->framebuffer_state.cbufs[i].texture) { fprintf(f, " " COLOR_STATE "cbufs[%i]:" COLOR_RESET "\n ", i); - DUMP(surface, dstate->framebuffer_state.cbufs[i]); + DUMP(surface, &dstate->framebuffer_state.cbufs[i]); fprintf(f, " "); - DUMP(resource, dstate->framebuffer_state.cbufs[i]->texture); + DUMP(resource, dstate->framebuffer_state.cbufs[i].texture); } - if (dstate->framebuffer_state.zsbuf) { + if (dstate->framebuffer_state.zsbuf.texture) { fprintf(f, " " COLOR_STATE "zsbuf:" COLOR_RESET "\n "); - DUMP(surface, dstate->framebuffer_state.zsbuf); + DUMP(surface, &dstate->framebuffer_state.zsbuf); fprintf(f, " "); - DUMP(resource, dstate->framebuffer_state.zsbuf->texture); + DUMP(resource, dstate->framebuffer_state.zsbuf.texture); } fprintf(f, "\n"); } diff --git a/src/gallium/auxiliary/driver_trace/tr_context.c b/src/gallium/auxiliary/driver_trace/tr_context.c index 25f454841fc..b8b59e94e68 100644 --- a/src/gallium/auxiliary/driver_trace/tr_context.c +++ b/src/gallium/auxiliary/driver_trace/tr_context.c @@ -987,16 +987,9 @@ trace_context_set_framebuffer_state(struct pipe_context *_pipe, { struct trace_context *tr_ctx = trace_context(_pipe); struct pipe_context *pipe = tr_ctx->pipe; - unsigned i; /* Unwrap the input state */ - memcpy(&tr_ctx->unwrapped_state, state, sizeof(tr_ctx->unwrapped_state)); - for (i = 0; i < state->nr_cbufs; ++i) - tr_ctx->unwrapped_state.cbufs[i] = trace_surface_unwrap(tr_ctx, state->cbufs[i]); - for (i = state->nr_cbufs; i < PIPE_MAX_COLOR_BUFS; ++i) - tr_ctx->unwrapped_state.cbufs[i] = NULL; - tr_ctx->unwrapped_state.zsbuf = trace_surface_unwrap(tr_ctx, state->zsbuf); - state = &tr_ctx->unwrapped_state; + util_copy_framebuffer_state(&tr_ctx->unwrapped_state, state); dump_fb_state(tr_ctx, "set_framebuffer_state", trace_dump_is_triggered()); diff --git a/src/gallium/auxiliary/driver_trace/tr_dump.h b/src/gallium/auxiliary/driver_trace/tr_dump.h index 5bed26aaa62..c55d7d239c6 100644 --- a/src/gallium/auxiliary/driver_trace/tr_dump.h +++ b/src/gallium/auxiliary/driver_trace/tr_dump.h @@ -191,6 +191,13 @@ bool trace_dump_is_triggered(void); trace_dump_member_end(); \ } while(0) +#define trace_dump_member_val(_type, _obj, _member) \ + do { \ + trace_dump_member_begin(#_member); \ + trace_dump_##_type(&(_obj)->_member); \ + trace_dump_member_end(); \ + } while(0) + #define trace_dump_member_enum(_type, _obj, _member) \ do { \ diff --git a/src/gallium/auxiliary/driver_trace/tr_dump_state.c b/src/gallium/auxiliary/driver_trace/tr_dump_state.c index 505b1ecb08b..abc87ed7a44 100644 --- a/src/gallium/auxiliary/driver_trace/tr_dump_state.c +++ b/src/gallium/auxiliary/driver_trace/tr_dump_state.c @@ -560,8 +560,10 @@ void trace_dump_framebuffer_state(const struct pipe_framebuffer_state *state) trace_dump_member(uint, state, samples); trace_dump_member(uint, state, layers); trace_dump_member(uint, state, nr_cbufs); - trace_dump_member_array(ptr, state, cbufs); - trace_dump_member(ptr, state, zsbuf); + trace_dump_member_begin("cbufs"); + trace_dump_array_impl(surface, state->cbufs, state->nr_cbufs, &); + trace_dump_member_end(); + trace_dump_member_val(surface, state, zsbuf); trace_dump_struct_end(); } @@ -578,8 +580,10 @@ void trace_dump_framebuffer_state_deep(const struct pipe_framebuffer_state *stat trace_dump_member(uint, state, samples); trace_dump_member(uint, state, layers); trace_dump_member(uint, state, nr_cbufs); - trace_dump_member_array(surface, state, cbufs); - trace_dump_member(surface, state, zsbuf); + trace_dump_member_begin("cbufs"); + trace_dump_array_impl(surface, state->cbufs, state->nr_cbufs, &); + trace_dump_member_end(); + trace_dump_member_val(surface, state, zsbuf); trace_dump_struct_end(); } @@ -677,7 +681,7 @@ void trace_dump_sampler_view_template(const struct pipe_sampler_view *state) void trace_dump_surface(const struct pipe_surface *surface) { - trace_dump_surface_template(surface, surface ? surface->texture->target : 0); + trace_dump_surface_template(surface, surface && surface->texture ? surface->texture->target : 0); } diff --git a/src/gallium/auxiliary/driver_trace/tr_video.c b/src/gallium/auxiliary/driver_trace/tr_video.c index 512ec548f82..d052c86ca8e 100644 --- a/src/gallium/auxiliary/driver_trace/tr_video.c +++ b/src/gallium/auxiliary/driver_trace/tr_video.c @@ -355,9 +355,6 @@ trace_video_buffer_destroy(struct pipe_video_buffer *_buffer) pipe_sampler_view_reference(&tr_vbuffer->sampler_view_planes[i], NULL); pipe_sampler_view_reference(&tr_vbuffer->sampler_view_components[i], NULL); } - for (int i=0; i < VL_MAX_SURFACES; i++) { - pipe_surface_reference(&tr_vbuffer->surfaces[i], NULL); - } video_buffer->destroy(video_buffer); ralloc_free(tr_vbuffer); @@ -431,30 +428,21 @@ trace_video_buffer_get_sampler_view_components(struct pipe_video_buffer *_buffer return view_components ? tr_vbuffer->sampler_view_components : NULL; } -static struct pipe_surface ** +static struct pipe_surface * trace_video_buffer_get_surfaces(struct pipe_video_buffer *_buffer) { - struct trace_context *tr_ctx = trace_context(_buffer->context); - struct trace_video_buffer *tr_vbuffer = trace_video_buffer(_buffer); - struct pipe_video_buffer *buffer = tr_vbuffer->video_buffer; + struct trace_video_buffer *tr_vbuffer = trace_video_buffer(_buffer); + struct pipe_video_buffer *buffer = tr_vbuffer->video_buffer; - trace_dump_call_begin("pipe_video_buffer", "get_surfaces"); - trace_dump_arg(ptr, buffer); + trace_dump_call_begin("pipe_video_buffer", "get_surfaces"); + trace_dump_arg(ptr, buffer); - struct pipe_surface **surfaces = buffer->get_surfaces(buffer); + struct pipe_surface *surfaces = buffer->get_surfaces(buffer); - trace_dump_ret_array(ptr, surfaces, VL_MAX_SURFACES); - trace_dump_call_end(); + trace_dump_array_impl(surface, surfaces, VL_MAX_SURFACES, &); + trace_dump_call_end(); - for (int i=0; i < VL_MAX_SURFACES; i++) { - if (!surfaces || !surfaces[i]) { - pipe_surface_reference(&tr_vbuffer->surfaces[i], NULL); - } else if (tr_vbuffer->surfaces[i] == NULL || (trace_surface(tr_vbuffer->surfaces[i])->surface != surfaces[i])){ - pipe_surface_reference(&tr_vbuffer->surfaces[i], trace_surf_create(tr_ctx, surfaces[i]->texture, surfaces[i])); - } - } - - return surfaces ? tr_vbuffer->surfaces : NULL; + return surfaces; } diff --git a/src/gallium/auxiliary/driver_trace/tr_video.h b/src/gallium/auxiliary/driver_trace/tr_video.h index dd3412b58c3..b1a022102ac 100644 --- a/src/gallium/auxiliary/driver_trace/tr_video.h +++ b/src/gallium/auxiliary/driver_trace/tr_video.h @@ -34,7 +34,6 @@ struct trace_video_buffer struct pipe_sampler_view *sampler_view_planes[VL_NUM_COMPONENTS]; struct pipe_sampler_view *sampler_view_components[VL_NUM_COMPONENTS]; - struct pipe_surface *surfaces[VL_MAX_SURFACES]; }; static inline struct trace_video_buffer * diff --git a/src/gallium/auxiliary/hud/hud_context.c b/src/gallium/auxiliary/hud/hud_context.c index d07879dd382..3128a2735cd 100644 --- a/src/gallium/auxiliary/hud/hud_context.c +++ b/src/gallium/auxiliary/hud/hud_context.c @@ -485,7 +485,7 @@ hud_draw_results(struct hud_context *hud, struct pipe_resource *tex) struct cso_context *cso = hud->cso; struct pipe_context *pipe = hud->pipe; struct pipe_framebuffer_state fb; - struct pipe_surface surf_templ, *surf; + struct pipe_surface surf_templ; struct pipe_viewport_state viewport; const struct pipe_sampler_state *sampler_states[] = { &hud->font_sampler_state }; @@ -545,12 +545,10 @@ hud_draw_results(struct hud_context *hud, struct pipe_resource *tex) if (srgb_format != PIPE_FORMAT_NONE) surf_templ.format = srgb_format; } - surf = pipe->create_surface(pipe, tex, &surf_templ); memset(&fb, 0, sizeof(fb)); fb.nr_cbufs = 1; - fb.cbufs[0] = surf; - fb.zsbuf = NULL; + fb.cbufs[0] = surf_templ; fb.width = hud->fb_width; fb.height = hud->fb_height; fb.resolve = NULL; @@ -664,8 +662,6 @@ done: ST_INVALIDATE_VS_CONSTBUF0 | ST_INVALIDATE_VERTEX_BUFFERS); } - - pipe_surface_reference(&surf, NULL); } static void diff --git a/src/gallium/auxiliary/postprocess/pp_init.c b/src/gallium/auxiliary/postprocess/pp_init.c index 09ad74c145e..f87b86cb9f5 100644 --- a/src/gallium/auxiliary/postprocess/pp_init.c +++ b/src/gallium/auxiliary/postprocess/pp_init.c @@ -159,14 +159,11 @@ pp_free_fbos(struct pp_queue_t *ppq) return; for (i = 0; i < ppq->n_tmp; i++) { - pipe_surface_reference(&ppq->tmps[i], NULL); pipe_resource_reference(&ppq->tmp[i], NULL); } for (i = 0; i < ppq->n_inner_tmp; i++) { - pipe_surface_reference(&ppq->inner_tmps[i], NULL); pipe_resource_reference(&ppq->inner_tmp[i], NULL); } - pipe_surface_reference(&ppq->stencils, NULL); pipe_resource_reference(&ppq->stencil, NULL); ppq->fbos_init = false; @@ -295,19 +292,18 @@ pp_init_fbos(struct pp_queue_t *ppq, unsigned int w, for (i = 0; i < ppq->n_tmp; i++) { ppq->tmp[i] = p->screen->resource_create(p->screen, &tmp_res); - ppq->tmps[i] = p->pipe->create_surface(p->pipe, ppq->tmp[i], &p->surf); + ppq->tmps[i] = p->surf; + ppq->tmps[i].texture = ppq->tmp[i]; - if (!ppq->tmp[i] || !ppq->tmps[i]) + if (!ppq->tmp[i]) goto error; } for (i = 0; i < ppq->n_inner_tmp; i++) { ppq->inner_tmp[i] = p->screen->resource_create(p->screen, &tmp_res); - ppq->inner_tmps[i] = p->pipe->create_surface(p->pipe, - ppq->inner_tmp[i], - &p->surf); - - if (!ppq->inner_tmp[i] || !ppq->inner_tmps[i]) + ppq->inner_tmps[i] = p->surf; + ppq->inner_tmps[i].texture = ppq->inner_tmp[i]; + if (!ppq->inner_tmp[i]) goto error; } @@ -326,8 +322,8 @@ pp_init_fbos(struct pp_queue_t *ppq, unsigned int w, } ppq->stencil = p->screen->resource_create(p->screen, &tmp_res); - ppq->stencils = p->pipe->create_surface(p->pipe, ppq->stencil, &p->surf); - if (!ppq->stencil || !ppq->stencils) + ppq->stencils = p->surf; + if (!ppq->stencil) goto error; p->framebuffer.width = w; diff --git a/src/gallium/auxiliary/postprocess/pp_mlaa.c b/src/gallium/auxiliary/postprocess/pp_mlaa.c index 65b373761e3..f45089b611a 100644 --- a/src/gallium/auxiliary/postprocess/pp_mlaa.c +++ b/src/gallium/auxiliary/postprocess/pp_mlaa.c @@ -184,7 +184,7 @@ pp_jimenezmlaa_run(struct pp_queue_t *ppq, struct pipe_resource *in, /* Blit the input to the output */ pp_blit(p->pipe, in, 0, 0, - w, h, 0, p->framebuffer.cbufs[0], + w, h, 0, &p->framebuffer.cbufs[0], 0, 0, w, h); u_sampler_view_default_template(&v_tmp, in, in->format); @@ -211,7 +211,7 @@ pp_jimenezmlaa_run(struct pp_queue_t *ppq, struct pipe_resource *in, pipe->sampler_view_release(pipe, arr[1]); p->blend.rt[0].blend_enable = 0; - p->framebuffer.zsbuf = NULL; + memset(&p->framebuffer.zsbuf, 0, sizeof(p->framebuffer.zsbuf)); } /** The init function of the MLAA filter. */ diff --git a/src/gallium/auxiliary/postprocess/pp_private.h b/src/gallium/auxiliary/postprocess/pp_private.h index 32e7c3a5ca2..ffafff63b54 100644 --- a/src/gallium/auxiliary/postprocess/pp_private.h +++ b/src/gallium/auxiliary/postprocess/pp_private.h @@ -83,7 +83,7 @@ struct pp_queue_t struct pipe_resource *stencil; /* stencil shared by inner_tmps */ struct pipe_resource *areamaptex; /* MLAA area map texture */ - struct pipe_surface *tmps[2], *inner_tmps[3], *stencils; + struct pipe_surface tmps[2], inner_tmps[3], stencils; void ***shaders; /* Shaders in TGSI form */ unsigned int *filters; /* Active filter to filters.h mapping. */ diff --git a/src/gallium/auxiliary/postprocess/pp_run.c b/src/gallium/auxiliary/postprocess/pp_run.c index bba404daac3..9114b7a58d0 100644 --- a/src/gallium/auxiliary/postprocess/pp_run.c +++ b/src/gallium/auxiliary/postprocess/pp_run.c @@ -110,7 +110,7 @@ pp_run(struct pp_queue_t *ppq, struct pipe_resource *in, pp_blit(ppq->p->pipe, in, 0, 0, - w, h, 0, ppq->tmps[0], + w, h, 0, &ppq->tmps[0], 0, 0, w, h); in = ppq->tmp[0]; @@ -223,14 +223,14 @@ pp_filter_setup_out(struct pp_program *p, struct pipe_resource *out) { p->surf.format = out->format; - p->framebuffer.cbufs[0] = p->pipe->create_surface(p->pipe, out, &p->surf); + p->framebuffer.cbufs[0] = p->surf; + p->framebuffer.cbufs[0].texture = out; } /** Clean up the input and output set with the above. */ void pp_filter_end_pass(struct pp_program *p) { - pipe_surface_reference(&p->framebuffer.cbufs[0], NULL); pipe_sampler_view_reference(&p->view, NULL); } diff --git a/src/gallium/auxiliary/util/u_blitter.c b/src/gallium/auxiliary/util/u_blitter.c index ceb5eb5b4ca..97b831ce429 100644 --- a/src/gallium/auxiliary/util/u_blitter.c +++ b/src/gallium/auxiliary/util/u_blitter.c @@ -1585,6 +1585,7 @@ void util_blitter_default_dst_texture(struct pipe_surface *dst_templ, unsigned dstz) { memset(dst_templ, 0, sizeof(*dst_templ)); + dst_templ->texture = dst; dst_templ->format = util_format_linear(dst->format); dst_templ->u.tex.level = dstlevel; dst_templ->u.tex.first_layer = dstz; @@ -1728,7 +1729,7 @@ void util_blitter_copy_texture(struct blitter_context *blitter, { struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; struct pipe_context *pipe = ctx->base.pipe; - struct pipe_surface *dst_view, dst_templ; + struct pipe_surface dst_templ; struct pipe_sampler_view src_templ, *src_view; struct pipe_box dstbox; @@ -1740,19 +1741,17 @@ void util_blitter_copy_texture(struct blitter_context *blitter, /* Initialize the surface. */ util_blitter_default_dst_texture(&dst_templ, dst, dst_level, dstz); - dst_view = pipe->create_surface(pipe, dst, &dst_templ); /* Initialize the sampler view. */ util_blitter_default_src_texture(blitter, &src_templ, src, src_level); src_view = pipe->create_sampler_view(pipe, src, &src_templ); /* Copy. */ - util_blitter_blit_generic(blitter, dst_view, &dstbox, + util_blitter_blit_generic(blitter, &dst_templ, &dstbox, src_view, srcbox, src->width0, src->height0, PIPE_MASK_RGBAZS, PIPE_TEX_FILTER_NEAREST, NULL, false, false, 0, NULL); - pipe_surface_reference(&dst_view, NULL); pipe_sampler_view_reference(&src_view, NULL); } @@ -1825,9 +1824,9 @@ static void do_blits(struct blitter_context_priv *ctx, (src_samples <= 1 || sample_shading)) { /* Set framebuffer state. */ if (is_zsbuf) { - fb_state.zsbuf = dst; + memcpy(&fb_state.zsbuf, dst, sizeof(*dst)); } else { - fb_state.cbufs[0] = dst; + memcpy(&fb_state.cbufs[0], dst, sizeof(*dst)); } pipe->set_framebuffer_state(pipe, &fb_state); @@ -1879,9 +1878,9 @@ static void do_blits(struct blitter_context_priv *ctx, /* Set framebuffer state. */ if (is_zsbuf) { - fb_state.zsbuf = dst; + memcpy(&fb_state.zsbuf, dst, sizeof(*dst)); } else { - fb_state.cbufs[0] = dst; + memcpy(&fb_state.cbufs[0], dst, sizeof(*dst)); } pipe->set_framebuffer_state(pipe, &fb_state); @@ -2200,7 +2199,7 @@ util_blitter_blit(struct blitter_context *blitter, struct pipe_resource *src = info->src.resource; struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; struct pipe_context *pipe = ctx->base.pipe; - struct pipe_surface *dst_view, dst_templ; + struct pipe_surface dst_templ; struct pipe_sampler_view src_templ, *src_view; const uint8_t *swizzle = info->swizzle_enable ? info->swizzle : NULL; @@ -2208,7 +2207,6 @@ util_blitter_blit(struct blitter_context *blitter, util_blitter_default_dst_texture(&dst_templ, dst, info->dst.level, info->dst.box.z); dst_templ.format = info->dst.format; - dst_view = pipe->create_surface(pipe, dst, &dst_templ); /* Initialize the sampler view. */ util_blitter_default_src_texture(blitter, &src_templ, src, info->src.level); @@ -2222,14 +2220,13 @@ util_blitter_blit(struct blitter_context *blitter, src_view = pipe->create_sampler_view(pipe, src, &src_templ); /* Copy. */ - util_blitter_blit_generic(blitter, dst_view, &info->dst.box, + util_blitter_blit_generic(blitter, &dst_templ, &info->dst.box, src_view, &info->src.box, src->width0, src->height0, info->mask, info->filter, info->scissor_enable ? &info->scissor : NULL, info->alpha_blend, info->sample0_only, info->dst_sample, fs_override); - pipe_surface_reference(&dst_view, NULL); pipe_sampler_view_reference(&src_view, NULL); } @@ -2241,7 +2238,7 @@ void util_blitter_generate_mipmap(struct blitter_context *blitter, { struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; struct pipe_context *pipe = ctx->base.pipe; - struct pipe_surface dst_templ, *dst_view; + struct pipe_surface dst_templ; struct pipe_sampler_view src_templ, *src_view; bool is_depth; void *sampler_state; @@ -2315,7 +2312,6 @@ void util_blitter_generate_mipmap(struct blitter_context *blitter, util_blitter_default_dst_texture(&dst_templ, tex, dst_level, first_layer); dst_templ.format = format; - dst_view = pipe->create_surface(pipe, tex, &dst_templ); /* Initialize the sampler view. */ util_blitter_default_src_texture(blitter, &src_templ, tex, src_level); @@ -2324,10 +2320,9 @@ void util_blitter_generate_mipmap(struct blitter_context *blitter, pipe->set_sampler_views(pipe, PIPE_SHADER_FRAGMENT, 0, 1, 0, &src_view); - do_blits(ctx, dst_view, &dstbox, src_view, tex->width0, tex->height0, + do_blits(ctx, &dst_templ, &dstbox, src_view, tex->width0, tex->height0, &srcbox, is_depth, false, false, 0); - pipe_surface_reference(&dst_view, NULL); pipe_sampler_view_reference(&src_view, NULL); } @@ -2372,9 +2367,7 @@ void util_blitter_clear_render_target(struct blitter_context *blitter, /* set a framebuffer state */ pipe_surface_size(dstsurf, &fb_state.width, &fb_state.height); fb_state.nr_cbufs = 1; - fb_state.cbufs[0] = dstsurf; - fb_state.zsbuf = NULL; - fb_state.resolve = NULL; + fb_state.cbufs[0] = *dstsurf; pipe->set_framebuffer_state(pipe, &fb_state); pipe->set_sample_mask(pipe, ~0); if (pipe->set_min_samples) @@ -2461,10 +2454,7 @@ void util_blitter_clear_depth_stencil(struct blitter_context *blitter, /* set a framebuffer state */ pipe_surface_size(dstsurf, &fb_state.width, &fb_state.height); - fb_state.nr_cbufs = 0; - fb_state.cbufs[0] = NULL; - fb_state.zsbuf = dstsurf; - fb_state.resolve = NULL; + fb_state.zsbuf = *dstsurf; pipe->set_framebuffer_state(pipe, &fb_state); pipe->set_sample_mask(pipe, ~0); if (pipe->set_min_samples) @@ -2526,16 +2516,11 @@ void util_blitter_custom_depth_stencil(struct blitter_context *blitter, /* set a framebuffer state */ pipe_surface_size(zsurf, &fb_state.width, &fb_state.height); - fb_state.nr_cbufs = 1; if (cbsurf) { - fb_state.cbufs[0] = cbsurf; + fb_state.cbufs[0] = *cbsurf; fb_state.nr_cbufs = 1; - } else { - fb_state.cbufs[0] = NULL; - fb_state.nr_cbufs = 0; } - fb_state.zsbuf = zsurf; - fb_state.resolve = NULL; + fb_state.zsbuf = *zsurf; pipe->set_framebuffer_state(pipe, &fb_state); pipe->set_sample_mask(pipe, sample_mask); if (pipe->set_min_samples) @@ -2569,7 +2554,7 @@ void util_blitter_custom_resolve_color(struct blitter_context *blitter, struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; struct pipe_context *pipe = ctx->base.pipe; struct pipe_framebuffer_state fb_state = { 0 }; - struct pipe_surface *srcsurf, *dstsurf, surf_tmpl; + struct pipe_surface srcsurf = {0}, dstsurf = {0}; util_blitter_set_running_flag(blitter); blitter_check_saved_vertex_states(ctx); @@ -2584,19 +2569,17 @@ void util_blitter_custom_resolve_color(struct blitter_context *blitter, if (pipe->set_min_samples) pipe->set_min_samples(pipe, 1); - memset(&surf_tmpl, 0, sizeof(surf_tmpl)); - surf_tmpl.format = format; - surf_tmpl.u.tex.level = dst_level; - surf_tmpl.u.tex.first_layer = dst_layer; - surf_tmpl.u.tex.last_layer = dst_layer; + dstsurf.format = format; + dstsurf.texture = dst; + dstsurf.u.tex.level = dst_level; + dstsurf.u.tex.first_layer = dst_layer; + dstsurf.u.tex.last_layer = dst_layer; - dstsurf = pipe->create_surface(pipe, dst, &surf_tmpl); - - surf_tmpl.u.tex.level = 0; - surf_tmpl.u.tex.first_layer = src_layer; - surf_tmpl.u.tex.last_layer = src_layer; - - srcsurf = pipe->create_surface(pipe, src, &surf_tmpl); + srcsurf.format = format; + srcsurf.texture = src; + srcsurf.u.tex.level = 0; + srcsurf.u.tex.first_layer = src_layer; + srcsurf.u.tex.last_layer = src_layer; /* set a framebuffer state */ fb_state.width = src->width0; @@ -2604,8 +2587,6 @@ void util_blitter_custom_resolve_color(struct blitter_context *blitter, fb_state.nr_cbufs = 2; fb_state.cbufs[0] = srcsurf; fb_state.cbufs[1] = dstsurf; - fb_state.zsbuf = NULL; - fb_state.resolve = NULL; pipe->set_framebuffer_state(pipe, &fb_state); blitter_set_common_draw_rect_state(ctx, false, @@ -2619,9 +2600,6 @@ void util_blitter_custom_resolve_color(struct blitter_context *blitter, util_blitter_restore_fragment_states(blitter); util_blitter_restore_render_cond(blitter); util_blitter_unset_running_flag(blitter); - - pipe_surface_reference(&srcsurf, NULL); - pipe_surface_reference(&dstsurf, NULL); } void util_blitter_custom_color(struct blitter_context *blitter, @@ -2652,9 +2630,7 @@ void util_blitter_custom_color(struct blitter_context *blitter, /* set a framebuffer state */ pipe_surface_size(dstsurf, &fb_state.width, &fb_state.height); fb_state.nr_cbufs = 1; - fb_state.cbufs[0] = dstsurf; - fb_state.zsbuf = NULL; - fb_state.resolve = NULL; + fb_state.cbufs[0] = *dstsurf; pipe->set_framebuffer_state(pipe, &fb_state); pipe->set_sample_mask(pipe, ~0); if (pipe->set_min_samples) @@ -2718,7 +2694,7 @@ void util_blitter_custom_shader(struct blitter_context *blitter, fb_state.width = width; fb_state.height = height; fb_state.nr_cbufs = 1; - fb_state.cbufs[0] = dstsurf; + fb_state.cbufs[0] = *dstsurf; fb_state.resolve = NULL; pipe->set_framebuffer_state(pipe, &fb_state); pipe->set_sample_mask(pipe, ~0); @@ -2796,9 +2772,8 @@ util_blitter_stencil_fallback(struct blitter_context *blitter, blitter_disable_render_cond(ctx); /* Initialize the surface. */ - struct pipe_surface *dst_view, dst_templ; + struct pipe_surface dst_templ; util_blitter_default_dst_texture(&dst_templ, dst, dst_level, dstbox->z); - dst_view = pipe->create_surface(pipe, dst, &dst_templ); /* Initialize the sampler view. */ struct pipe_sampler_view src_templ, *src_view; @@ -2815,7 +2790,7 @@ util_blitter_stencil_fallback(struct blitter_context *blitter, struct pipe_framebuffer_state fb_state = { 0 }; fb_state.width = dstbox->x + dstbox->width; fb_state.height = dstbox->y + dstbox->height; - fb_state.zsbuf = dst_view; + fb_state.zsbuf = dst_templ; fb_state.resolve = NULL; pipe->set_framebuffer_state(pipe, &fb_state); pipe->set_sample_mask(pipe, ~0); @@ -2824,8 +2799,8 @@ util_blitter_stencil_fallback(struct blitter_context *blitter, blitter_set_common_draw_rect_state(ctx, scissor != NULL, util_framebuffer_get_num_samples(&fb_state) > 1); - blitter_set_dst_dimensions(ctx, pipe_surface_width(dst_view), - pipe_surface_height(dst_view)); + blitter_set_dst_dimensions(ctx, pipe_surface_width(&dst_templ), + pipe_surface_height(&dst_templ)); if (scissor) { pipe->set_scissor_states(pipe, 0, 1, scissor); @@ -2884,6 +2859,5 @@ util_blitter_stencil_fallback(struct blitter_context *blitter, util_blitter_restore_constant_buffer_state(blitter); util_blitter_unset_running_flag(blitter); - pipe_surface_reference(&dst_view, NULL); pipe_sampler_view_reference(&src_view, NULL); } diff --git a/src/gallium/auxiliary/util/u_dump_state.c b/src/gallium/auxiliary/util/u_dump_state.c index 0b061923aac..5bb22b12972 100644 --- a/src/gallium/auxiliary/util/u_dump_state.c +++ b/src/gallium/auxiliary/util/u_dump_state.c @@ -211,6 +211,13 @@ util_dump_ptr(FILE *stream, const void *value) util_dump_member_end(_stream); \ } while(0) +#define util_dump_member_val(_stream, _type, _obj, _member) \ + do { \ + util_dump_member_begin(_stream, #_member); \ + util_dump_##_type(_stream, &(_obj)->_member); \ + util_dump_member_end(_stream); \ + } while(0) + #define util_dump_arg_array(_stream, _type, _arg, _size) \ do { \ util_dump_arg_begin(_stream, #_arg); \ @@ -225,6 +232,13 @@ util_dump_ptr(FILE *stream, const void *value) util_dump_member_end(_stream); \ } while(0) +#define util_dump_member_array_val(_stream, _type, _obj, _member) \ + do { \ + util_dump_member_begin(_stream, #_member); \ + util_dump_struct_array(_stream, _type, (_obj)->_member, sizeof((_obj)->_member)/sizeof((_obj)->_member[0])); \ + util_dump_member_end(_stream); \ + } while(0) + /* @@ -664,8 +678,8 @@ util_dump_framebuffer_state(FILE *stream, const struct pipe_framebuffer_state *s util_dump_member(stream, uint, state, samples); util_dump_member(stream, uint, state, layers); util_dump_member(stream, uint, state, nr_cbufs); - util_dump_member_array(stream, ptr, state, cbufs); - util_dump_member(stream, ptr, state, zsbuf); + util_dump_member_array_val(stream, surface, state, cbufs); + util_dump_member_val(stream, ptr, state, zsbuf); util_dump_struct_end(stream); } diff --git a/src/gallium/auxiliary/util/u_framebuffer.c b/src/gallium/auxiliary/util/u_framebuffer.c index 054803ff024..7ba45614c33 100644 --- a/src/gallium/auxiliary/util/u_framebuffer.c +++ b/src/gallium/auxiliary/util/u_framebuffer.c @@ -64,12 +64,11 @@ util_framebuffer_state_equal(const struct pipe_framebuffer_state *dst, } for (i = 0; i < src->nr_cbufs; i++) { - if (dst->cbufs[i] != src->cbufs[i]) { + if (!pipe_surface_equal(&dst->cbufs[i], &src->cbufs[i])) return false; - } } - if (dst->zsbuf != src->zsbuf) { + if (!pipe_surface_equal(&dst->zsbuf, &src->zsbuf)) { return false; } @@ -100,34 +99,25 @@ util_copy_framebuffer_state(struct pipe_framebuffer_state *dst, dst->samples = src->samples; dst->layers = src->layers; - for (i = 0; i < src->nr_cbufs; i++) - pipe_surface_reference(&dst->cbufs[i], src->cbufs[i]); + for (i = 0; i < src->nr_cbufs; i++) { + pipe_resource_reference(&dst->cbufs[i].texture, src->cbufs[i].texture); + dst->cbufs[i] = src->cbufs[i]; + } /* Set remaining dest cbuf pointers to NULL */ - for ( ; i < ARRAY_SIZE(dst->cbufs); i++) - pipe_surface_reference(&dst->cbufs[i], NULL); + for ( ; i < ARRAY_SIZE(dst->cbufs); i++) { + pipe_resource_reference(&dst->cbufs[i].texture, NULL); + memset(&dst->cbufs[i], 0, sizeof(dst->cbufs[i])); + } dst->nr_cbufs = src->nr_cbufs; dst->viewmask = src->viewmask; - pipe_surface_reference(&dst->zsbuf, src->zsbuf); + pipe_resource_reference(&dst->zsbuf.texture, src->zsbuf.texture); + dst->zsbuf = src->zsbuf; pipe_resource_reference(&dst->resolve, src->resolve); } else { - dst->width = 0; - dst->height = 0; - - dst->samples = 0; - dst->layers = 0; - - for (i = 0 ; i < ARRAY_SIZE(dst->cbufs); i++) - pipe_surface_reference(&dst->cbufs[i], NULL); - - dst->nr_cbufs = 0; - - dst->viewmask = 0; - - pipe_surface_reference(&dst->zsbuf, NULL); - pipe_resource_reference(&dst->resolve, NULL); + util_unreference_framebuffer_state(dst); } } @@ -137,18 +127,11 @@ util_unreference_framebuffer_state(struct pipe_framebuffer_state *fb) { unsigned i; - for (i = 0; i < fb->nr_cbufs; i++) { - pipe_surface_reference(&fb->cbufs[i], NULL); - } - - pipe_surface_reference(&fb->zsbuf, NULL); + for (i = 0 ; i < ARRAY_SIZE(fb->cbufs); i++) + pipe_resource_reference(&fb->cbufs[i].texture, NULL); + pipe_resource_reference(&fb->zsbuf.texture, NULL); pipe_resource_reference(&fb->resolve, NULL); - - fb->samples = fb->layers = 0; - fb->width = fb->height = 0; - fb->nr_cbufs = 0; - - fb->viewmask = 0; + memset(fb, 0, sizeof(*fb)); } @@ -165,19 +148,19 @@ util_framebuffer_min_size(const struct pipe_framebuffer_state *fb, unsigned i; for (i = 0; i < fb->nr_cbufs; i++) { - if (!fb->cbufs[i]) + if (!fb->cbufs[i].texture) continue; uint16_t width, height; - pipe_surface_size(fb->cbufs[i], &width, &height); + pipe_surface_size(&fb->cbufs[i], &width, &height); w = MIN2(w, width); h = MIN2(h, height); } - if (fb->zsbuf) { + if (fb->zsbuf.texture) { uint16_t width, height; - pipe_surface_size(fb->zsbuf, &width, &height); + pipe_surface_size(&fb->zsbuf, &width, &height); w = MIN2(w, width); h = MIN2(h, height); } @@ -208,19 +191,19 @@ util_framebuffer_get_num_layers(const struct pipe_framebuffer_state *fb) * we obtain the number of layers directly from * the framebuffer state. */ - if (!(fb->nr_cbufs || fb->zsbuf)) + if (!(fb->nr_cbufs || fb->zsbuf.texture)) return fb->layers; for (i = 0; i < fb->nr_cbufs; i++) { - if (fb->cbufs[i]) { - unsigned num = fb->cbufs[i]->u.tex.last_layer - - fb->cbufs[i]->u.tex.first_layer + 1; + if (fb->cbufs[i].texture) { + unsigned num = fb->cbufs[i].u.tex.last_layer - + fb->cbufs[i].u.tex.first_layer + 1; num_layers = MAX2(num_layers, num); } } - if (fb->zsbuf) { - unsigned num = fb->zsbuf->u.tex.last_layer - - fb->zsbuf->u.tex.first_layer + 1; + if (fb->zsbuf.texture) { + unsigned num = fb->zsbuf.u.tex.last_layer - + fb->zsbuf.u.tex.first_layer + 1; num_layers = MAX2(num_layers, num); } return num_layers; @@ -246,7 +229,7 @@ util_framebuffer_get_num_samples(const struct pipe_framebuffer_state *fb) * if samples is legitimately not getting set somewhere * multi-sampling will evidently break. */ - if (!(fb->nr_cbufs || fb->zsbuf)) + if (!(fb->nr_cbufs || fb->zsbuf.texture)) return MAX2(fb->samples, 1); /** @@ -254,14 +237,14 @@ util_framebuffer_get_num_samples(const struct pipe_framebuffer_state *fb) * pipe_surface::nr_samples will always be 0. */ for (i = 0; i < fb->nr_cbufs; i++) { - if (fb->cbufs[i]) { - return MAX3(1, fb->cbufs[i]->texture->nr_samples, - fb->cbufs[i]->nr_samples); + if (fb->cbufs[i].texture) { + return MAX3(1, fb->cbufs[i].texture->nr_samples, + fb->cbufs[i].nr_samples); } } - if (fb->zsbuf) { - return MAX3(1, fb->zsbuf->texture->nr_samples, - fb->zsbuf->nr_samples); + if (fb->zsbuf.texture) { + return MAX3(1, fb->zsbuf.texture->nr_samples, + fb->zsbuf.nr_samples); } return MAX2(fb->samples, 1); @@ -296,3 +279,41 @@ util_sample_locations_flip_y(struct pipe_screen *screen, unsigned fb_height, memcpy(locations, new_locations, grid_width * grid_height * samples); } + +void +util_framebuffer_init(struct pipe_context *pctx, const struct pipe_framebuffer_state *fb, struct pipe_surface **cbufs, struct pipe_surface **zsbuf) +{ + if (fb) { + for (unsigned i = 0; i < fb->nr_cbufs; i++) { + if (cbufs[i] && pipe_surface_equal(&fb->cbufs[i], cbufs[i])) + continue; + + struct pipe_surface *psurf = fb->cbufs[i].texture ? pctx->create_surface(pctx, fb->cbufs[i].texture, &fb->cbufs[i]) : NULL; + if (cbufs[i]) + pipe_surface_unref(pctx, &cbufs[i]); + cbufs[i] = psurf; + } + + for (unsigned i = fb->nr_cbufs; i < PIPE_MAX_COLOR_BUFS; i++) { + if (cbufs[i]) + pipe_surface_unref(pctx, &cbufs[i]); + cbufs[i] = NULL; + } + + if (*zsbuf && pipe_surface_equal(&fb->zsbuf, *zsbuf)) + return; + struct pipe_surface *zsurf = fb->zsbuf.texture ? pctx->create_surface(pctx, fb->zsbuf.texture, &fb->zsbuf) : NULL; + if (*zsbuf) + pipe_surface_unref(pctx, zsbuf); + *zsbuf = zsurf; + } else { + for (unsigned i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { + if (cbufs[i]) + pipe_surface_unref(pctx, &cbufs[i]); + cbufs[i] = NULL; + } + if (*zsbuf) + pipe_surface_unref(pctx, zsbuf); + *zsbuf = NULL; + } +} diff --git a/src/gallium/auxiliary/util/u_framebuffer.h b/src/gallium/auxiliary/util/u_framebuffer.h index 73f71c8f54b..9e95f7e6cb8 100644 --- a/src/gallium/auxiliary/util/u_framebuffer.h +++ b/src/gallium/auxiliary/util/u_framebuffer.h @@ -69,6 +69,17 @@ util_sample_locations_flip_y(struct pipe_screen *screen, unsigned fb_height, unsigned samples, uint8_t *locations); +void +#ifndef _WIN32 +__attribute__((deprecated)) +#endif +util_framebuffer_init(struct pipe_context *pctx, const struct pipe_framebuffer_state *fb, struct pipe_surface **cbufs, struct pipe_surface **zsbuf); + +/* if you see this in your driver stop using it */ +#define PIPE_FB_SURFACES \ + struct pipe_surface *fb_cbufs[PIPE_MAX_COLOR_BUFS]; \ + struct pipe_surface *fb_zsbuf + #ifdef __cplusplus } #endif diff --git a/src/gallium/auxiliary/util/u_inlines.h b/src/gallium/auxiliary/util/u_inlines.h index 4d383dcdbb7..d99cc3368c3 100644 --- a/src/gallium/auxiliary/util/u_inlines.h +++ b/src/gallium/auxiliary/util/u_inlines.h @@ -423,13 +423,13 @@ pipe_surface_size(const struct pipe_surface *ps, uint16_t *width, uint16_t *heig static inline bool pipe_surface_equal(const struct pipe_surface *s1, const struct pipe_surface *s2) { - return s1->texture == s2->texture && + return !!s1 == !!s2 && s1->texture == s2->texture && s1->format == s2->format && s1->nr_samples == s2->nr_samples && - (s1->texture->target != PIPE_BUFFER || + ((s1->texture && s1->texture->target != PIPE_BUFFER) || (s1->u.buf.first_element == s2->u.buf.first_element && s1->u.buf.last_element == s2->u.buf.last_element)) && - (s1->texture->target == PIPE_BUFFER || + ((s1->texture && s1->texture->target == PIPE_BUFFER) || (s1->u.tex.level == s2->u.tex.level && s1->u.tex.first_layer == s2->u.tex.first_layer && s1->u.tex.last_layer == s2->u.tex.last_layer)); diff --git a/src/gallium/auxiliary/util/u_surface.c b/src/gallium/auxiliary/util/u_surface.c index 7801b933584..524850ffe5b 100644 --- a/src/gallium/auxiliary/util/u_surface.c +++ b/src/gallium/auxiliary/util/u_surface.c @@ -55,6 +55,7 @@ u_surface_default_template(struct pipe_surface *surf, memset(surf, 0, sizeof(*surf)); surf->format = texture->format; + surf->texture = (void*)texture; } diff --git a/src/gallium/auxiliary/util/u_tests.c b/src/gallium/auxiliary/util/u_tests.c index 03e029b9ba2..58fdb11d8db 100644 --- a/src/gallium/auxiliary/util/u_tests.c +++ b/src/gallium/auxiliary/util/u_tests.c @@ -70,19 +70,18 @@ static void util_set_framebuffer_cb0(struct cso_context *cso, struct pipe_context *ctx, struct pipe_resource *tex) { - struct pipe_surface templ = {{0}}, *surf; + struct pipe_surface templ = {{0}}; struct pipe_framebuffer_state fb = {0}; templ.format = tex->format; - surf = ctx->create_surface(ctx, tex, &templ); + templ.texture = tex; fb.width = tex->width0; fb.height = tex->height0; - fb.cbufs[0] = surf; + fb.cbufs[0] = templ; fb.nr_cbufs = 1; cso_set_framebuffer(cso, &fb); - pipe_surface_reference(&surf, NULL); } static void diff --git a/src/gallium/auxiliary/util/u_threaded_context.c b/src/gallium/auxiliary/util/u_threaded_context.c index 0bb431c57af..f2d8d5d7f28 100644 --- a/src/gallium/auxiliary/util/u_threaded_context.c +++ b/src/gallium/auxiliary/util/u_threaded_context.c @@ -27,6 +27,7 @@ #include "util/u_threaded_context.h" #include "util/u_cpu_detect.h" #include "util/format/u_format.h" +#include "util/u_framebuffer.h" #include "util/u_inlines.h" #include "util/u_memory.h" #include "util/u_upload_mgr.h" @@ -1415,12 +1416,8 @@ tc_call_set_framebuffer_state(struct pipe_context *pipe, void *call) struct pipe_framebuffer_state *p = &to_call(call, tc_framebuffer)->state; pipe->set_framebuffer_state(pipe, p); + util_unreference_framebuffer_state(p); - unsigned nr_cbufs = p->nr_cbufs; - for (unsigned i = 0; i < nr_cbufs; i++) - tc_drop_surface_reference(p->cbufs[i]); - tc_drop_surface_reference(p->zsbuf); - tc_drop_resource_reference(p->resolve); return call_size(tc_framebuffer); } @@ -1433,12 +1430,7 @@ tc_set_framebuffer_state(struct pipe_context *_pipe, tc_add_call(tc, TC_CALL_set_framebuffer_state, tc_framebuffer); unsigned nr_cbufs = fb->nr_cbufs; - p->state.width = fb->width; - p->state.height = fb->height; - p->state.samples = fb->samples; - p->state.layers = fb->layers; - p->state.nr_cbufs = nr_cbufs; - p->state.viewmask = fb->viewmask; + p->state = *fb; /* when unbinding, mark attachments as used for the current batch */ for (unsigned i = 0; i < tc->nr_cbufs; i++) { @@ -1449,11 +1441,11 @@ tc_set_framebuffer_state(struct pipe_context *_pipe, tc_set_resource_batch_usage_persistent(tc, tc->fb_resolve, false); for (unsigned i = 0; i < nr_cbufs; i++) { - p->state.cbufs[i] = NULL; - pipe_surface_reference(&p->state.cbufs[i], fb->cbufs[i]); + /* ref for cmd */ + struct pipe_resource *ref = NULL; + pipe_resource_reference(&ref, fb->cbufs[i].texture); /* full tracking requires storing the fb attachment resources */ - if (fb->cbufs[i]) - pipe_resource_reference(&tc->fb_resources[i], fb->cbufs[i]->texture); + pipe_resource_reference(&tc->fb_resources[i], fb->cbufs[i].texture); tc_set_resource_batch_usage_persistent(tc, tc->fb_resources[i], true); } tc->nr_cbufs = nr_cbufs; @@ -1469,8 +1461,7 @@ tc_set_framebuffer_state(struct pipe_context *_pipe, uint8_t zsbuf = tc->renderpass_info_recording->has_draw ? 0 : tc->renderpass_info_recording->data8[3]; - bool zsbuf_changed = tc->fb_resources[PIPE_MAX_COLOR_BUFS] != - (fb->zsbuf ? fb->zsbuf->texture : NULL); + bool zsbuf_changed = tc->fb_resources[PIPE_MAX_COLOR_BUFS] != fb->zsbuf.texture; if (tc->seen_fb_state) { /* this is the end of a renderpass, so increment the renderpass info */ @@ -1489,16 +1480,19 @@ tc_set_framebuffer_state(struct pipe_context *_pipe, /* future fb state changes will increment the index */ tc->seen_fb_state = true; } - pipe_resource_reference(&tc->fb_resources[PIPE_MAX_COLOR_BUFS], - fb->zsbuf ? fb->zsbuf->texture : NULL); + /* ref for cmd */ + struct pipe_resource *zsref = NULL; + pipe_resource_reference(&zsref, fb->zsbuf.texture); + pipe_resource_reference(&tc->fb_resources[PIPE_MAX_COLOR_BUFS], fb->zsbuf.texture); + + /* ref for cmd */ + struct pipe_resource *rref = NULL; + pipe_resource_reference(&rref, fb->resolve); pipe_resource_reference(&tc->fb_resolve, fb->resolve); tc_set_resource_batch_usage_persistent(tc, tc->fb_resources[PIPE_MAX_COLOR_BUFS], true); tc_set_resource_batch_usage_persistent(tc, tc->fb_resolve, true); tc->in_renderpass = false; - p->state.zsbuf = NULL; - pipe_surface_reference(&p->state.zsbuf, fb->zsbuf); p->state.resolve = NULL; - pipe_resource_reference(&p->state.resolve, fb->resolve); } struct tc_tess_state { diff --git a/src/gallium/auxiliary/util/u_trace_gallium.c b/src/gallium/auxiliary/util/u_trace_gallium.c index df79a7c3011..b61386fdccd 100644 --- a/src/gallium/auxiliary/util/u_trace_gallium.c +++ b/src/gallium/auxiliary/util/u_trace_gallium.c @@ -90,12 +90,12 @@ trace_framebuffer_state(struct u_trace *ut, void *cs, const struct pipe_framebuf trace_framebuffer(ut, cs, pfb); for (unsigned i = 0; i < pfb->nr_cbufs; i++) { - if (pfb->cbufs[i]) { - trace_surface(ut, cs, pfb->cbufs[i]); + if (pfb->cbufs[i].texture) { + trace_surface(ut, cs, &pfb->cbufs[i]); } } - if (pfb->zsbuf) { - trace_surface(ut, cs, pfb->zsbuf); + if (pfb->zsbuf.texture) { + trace_surface(ut, cs, &pfb->zsbuf); } } diff --git a/src/gallium/auxiliary/vl/vl_bicubic_filter.c b/src/gallium/auxiliary/vl/vl_bicubic_filter.c index 17fda6251ea..95fc7621b31 100644 --- a/src/gallium/auxiliary/vl/vl_bicubic_filter.c +++ b/src/gallium/auxiliary/vl/vl_bicubic_filter.c @@ -443,7 +443,7 @@ vl_bicubic_filter_render(struct vl_bicubic_filter *filter, fb_state.width = pipe_surface_width(dst); fb_state.height = pipe_surface_height(dst); fb_state.nr_cbufs = 1; - fb_state.cbufs[0] = dst; + fb_state.cbufs[0] = *dst; filter->pipe->set_scissor_states(filter->pipe, 0, 1, &scissor); filter->pipe->clear_render_target(filter->pipe, dst, &clear_color, diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c index f4bc79245db..4ca12f923ab 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.c +++ b/src/gallium/auxiliary/vl/vl_compositor.c @@ -144,7 +144,7 @@ init_pipe_state(struct vl_compositor *c) assert(c); c->fb_state.nr_cbufs = 1; - c->fb_state.zsbuf = NULL; + memset(&c->fb_state.zsbuf, 0, sizeof(c->fb_state.zsbuf)); memset(&sampler, 0, sizeof(sampler)); sampler.wrap_s = PIPE_TEX_WRAP_CLAMP_TO_EDGE; @@ -737,43 +737,43 @@ vl_compositor_yuv_deint_full(struct vl_compositor_state *s, struct u_rect *dst_rect, enum vl_compositor_deinterlace deinterlace) { - struct pipe_surface **dst_surfaces; + struct pipe_surface *dst_surfaces; dst_surfaces = dst->get_surfaces(dst); set_yuv_layer(s, c, 0, src, src_rect, NULL, VL_COMPOSITOR_PLANE_Y, deinterlace); vl_compositor_set_layer_dst_area(s, 0, dst_rect); - vl_compositor_render(s, c, dst_surfaces[0], NULL, false); + vl_compositor_render(s, c, &dst_surfaces[0], NULL, false); - if (dst_surfaces[1]) { + if (dst_surfaces[1].texture) { bool clear = util_format_get_nr_components(src->buffer_format) == 1; union pipe_color_union clear_color = { .f = {0.5, 0.5} }; dst_rect->x0 = util_format_get_plane_width(dst->buffer_format, 1, dst_rect->x0); dst_rect->x1 = util_format_get_plane_width(dst->buffer_format, 1, dst_rect->x1); dst_rect->y0 = util_format_get_plane_height(dst->buffer_format, 1, dst_rect->y0); dst_rect->y1 = util_format_get_plane_height(dst->buffer_format, 1, dst_rect->y1); - set_yuv_layer(s, c, 0, src, src_rect, NULL, dst_surfaces[2] ? VL_COMPOSITOR_PLANE_U : + set_yuv_layer(s, c, 0, src, src_rect, NULL, dst_surfaces[2].texture ? VL_COMPOSITOR_PLANE_U : VL_COMPOSITOR_PLANE_UV, deinterlace); vl_compositor_set_layer_dst_area(s, 0, dst_rect); if (clear) { struct u_rect clear_rect = *dst_rect; s->used_layers = 0; vl_compositor_set_clear_color(s, &clear_color); - vl_compositor_render(s, c, dst_surfaces[1], &clear_rect, true); + vl_compositor_render(s, c, &dst_surfaces[1], &clear_rect, true); } else { - vl_compositor_render(s, c, dst_surfaces[1], NULL, false); + vl_compositor_render(s, c, &dst_surfaces[1], NULL, false); } - if (dst_surfaces[2]) { + if (dst_surfaces[2].texture) { set_yuv_layer(s, c, 0, src, src_rect, NULL, VL_COMPOSITOR_PLANE_V, deinterlace); vl_compositor_set_layer_dst_area(s, 0, dst_rect); if (clear) { struct u_rect clear_rect = *dst_rect; s->used_layers = 0; vl_compositor_set_clear_color(s, &clear_color); - vl_compositor_render(s, c, dst_surfaces[2], &clear_rect, true); + vl_compositor_render(s, c, &dst_surfaces[2], &clear_rect, true); } else { - vl_compositor_render(s, c, dst_surfaces[2], NULL, false); + vl_compositor_render(s, c, &dst_surfaces[2], NULL, false); } } } @@ -789,7 +789,7 @@ vl_compositor_convert_rgb_to_yuv(struct vl_compositor_state *s, struct u_rect *dst_rect) { struct pipe_sampler_view *sv, sv_templ; - struct pipe_surface **dst_surfaces; + struct pipe_surface *dst_surfaces; dst_surfaces = dst->get_surfaces(dst); @@ -799,22 +799,22 @@ vl_compositor_convert_rgb_to_yuv(struct vl_compositor_state *s, set_rgb_to_yuv_layer(s, c, 0, sv, src_rect, NULL, VL_COMPOSITOR_PLANE_Y); vl_compositor_set_layer_dst_area(s, 0, dst_rect); - vl_compositor_render(s, c, dst_surfaces[0], NULL, false); + vl_compositor_render(s, c, &dst_surfaces[0], NULL, false); - if (dst_surfaces[1]) { + if (dst_surfaces[1].texture) { dst_rect->x0 = util_format_get_plane_width(dst->buffer_format, 1, dst_rect->x0); dst_rect->x1 = util_format_get_plane_width(dst->buffer_format, 1, dst_rect->x1); dst_rect->y0 = util_format_get_plane_height(dst->buffer_format, 1, dst_rect->y0); dst_rect->y1 = util_format_get_plane_height(dst->buffer_format, 1, dst_rect->y1); - set_rgb_to_yuv_layer(s, c, 0, sv, src_rect, NULL, dst_surfaces[2] ? VL_COMPOSITOR_PLANE_U : + set_rgb_to_yuv_layer(s, c, 0, sv, src_rect, NULL, dst_surfaces[2].texture ? VL_COMPOSITOR_PLANE_U : VL_COMPOSITOR_PLANE_UV); vl_compositor_set_layer_dst_area(s, 0, dst_rect); - vl_compositor_render(s, c, dst_surfaces[1], NULL, false); + vl_compositor_render(s, c, &dst_surfaces[1], NULL, false); - if (dst_surfaces[2]) { + if (dst_surfaces[2].texture) { set_rgb_to_yuv_layer(s, c, 0, sv, src_rect, NULL, VL_COMPOSITOR_PLANE_V); vl_compositor_set_layer_dst_area(s, 0, dst_rect); - vl_compositor_render(s, c, dst_surfaces[2], NULL, false); + vl_compositor_render(s, c, &dst_surfaces[2], NULL, false); } } diff --git a/src/gallium/auxiliary/vl/vl_compositor_cs.c b/src/gallium/auxiliary/vl/vl_compositor_cs.c index 6935d371412..ebecb657231 100644 --- a/src/gallium/auxiliary/vl/vl_compositor_cs.c +++ b/src/gallium/auxiliary/vl/vl_compositor_cs.c @@ -611,9 +611,9 @@ cs_launch(struct vl_compositor *c, /* Bind the image */ struct pipe_image_view image = {0}; - image.resource = c->fb_state.cbufs[0]->texture; + image.resource = c->fb_state.cbufs[0].texture; image.shader_access = image.access = PIPE_IMAGE_ACCESS_READ_WRITE; - image.format = c->fb_state.cbufs[0]->texture->format; + image.format = c->fb_state.cbufs[0].texture->format; ctx->set_shader_images(c->pipe, PIPE_SHADER_COMPUTE, 0, 1, 0, &image); @@ -892,7 +892,7 @@ vl_compositor_cs_render(struct vl_compositor_state *s, assert(dst_surface); pipe_surface_size(dst_surface, &c->fb_state.width, &c->fb_state.height); - c->fb_state.cbufs[0] = dst_surface; + c->fb_state.cbufs[0] = *dst_surface; if (!s->scissor_valid) { s->scissor.minx = 0; diff --git a/src/gallium/auxiliary/vl/vl_compositor_gfx.c b/src/gallium/auxiliary/vl/vl_compositor_gfx.c index 75d5c7f6c0c..688ea3d7ac8 100644 --- a/src/gallium/auxiliary/vl/vl_compositor_gfx.c +++ b/src/gallium/auxiliary/vl/vl_compositor_gfx.c @@ -714,7 +714,7 @@ vl_compositor_gfx_render(struct vl_compositor_state *s, assert(dst_surface); pipe_surface_size(dst_surface, &c->fb_state.width, &c->fb_state.height); - c->fb_state.cbufs[0] = dst_surface; + c->fb_state.cbufs[0] = *dst_surface; if (!s->scissor_valid) { s->scissor.minx = 0; diff --git a/src/gallium/auxiliary/vl/vl_deint_filter.c b/src/gallium/auxiliary/vl/vl_deint_filter.c index b75322fd77d..12b5a3ba8d4 100644 --- a/src/gallium/auxiliary/vl/vl_deint_filter.c +++ b/src/gallium/auxiliary/vl/vl_deint_filter.c @@ -471,7 +471,7 @@ vl_deint_filter_render(struct vl_deint_filter *filter, struct pipe_sampler_view **prev_sv; struct pipe_sampler_view **next_sv; struct pipe_sampler_view *sampler_views[4]; - struct pipe_surface **dst_surfaces; + struct pipe_surface *dst_surfaces; const unsigned *plane_order; int i; unsigned j; @@ -513,8 +513,8 @@ vl_deint_filter_render(struct vl_deint_filter *filter, /* process each plane separately */ for (i = 0, j = 0; i < VL_NUM_COMPONENTS; ++i) { - struct pipe_surface *blit_surf = dst_surfaces[field]; - struct pipe_surface *dst_surf = dst_surfaces[1 - field]; + struct pipe_surface *blit_surf = &dst_surfaces[field]; + struct pipe_surface *dst_surf = &dst_surfaces[1 - field]; int k = plane_order[i]; /* bind blend state for this component in the plane */ @@ -535,14 +535,14 @@ vl_deint_filter_render(struct vl_deint_filter *filter, 0, 4, 0, sampler_views); /* blit current field */ - fb_state.cbufs[0] = blit_surf; + fb_state.cbufs[0] = *blit_surf; filter->pipe->bind_fs_state(filter->pipe, field ? filter->fs_copy_bottom : filter->fs_copy_top); filter->pipe->set_framebuffer_state(filter->pipe, &fb_state); filter->pipe->set_viewport_states(filter->pipe, 0, 1, &viewport); util_draw_arrays(filter->pipe, MESA_PRIM_QUADS, 0, 4); /* blit or interpolate other field */ - fb_state.cbufs[0] = dst_surf; + fb_state.cbufs[0] = *dst_surf; filter->pipe->set_framebuffer_state(filter->pipe, &fb_state); if (i > 0 && filter->skip_chroma) { util_draw_arrays(filter->pipe, MESA_PRIM_QUADS, 0, 4); diff --git a/src/gallium/auxiliary/vl/vl_deint_filter_cs.c b/src/gallium/auxiliary/vl/vl_deint_filter_cs.c index 54e96510617..b0206b826c0 100644 --- a/src/gallium/auxiliary/vl/vl_deint_filter_cs.c +++ b/src/gallium/auxiliary/vl/vl_deint_filter_cs.c @@ -204,7 +204,7 @@ vl_deint_filter_cs_render(struct vl_deint_filter *filter, struct pipe_sampler_view **prev_sv; struct pipe_sampler_view **next_sv; struct pipe_sampler_view *sampler_views[4]; - struct pipe_surface **dst_surfaces; + struct pipe_surface *dst_surfaces; /* Set up destination and source */ dst_surfaces = filter->video_buffer->get_surfaces(filter->video_buffer); @@ -217,7 +217,7 @@ vl_deint_filter_cs_render(struct vl_deint_filter *filter, 0, 4, filter->sampler); for (unsigned i = 0; i < 2; i++) { - struct pipe_surface *dst = dst_surfaces[i]; + struct pipe_surface *dst = &dst_surfaces[i]; /* Update sampler view sources */ sampler_views[0] = prevprev_sv[i]; diff --git a/src/gallium/auxiliary/vl/vl_idct.c b/src/gallium/auxiliary/vl/vl_idct.c index bce4351f1c2..3d332342d80 100644 --- a/src/gallium/auxiliary/vl/vl_idct.c +++ b/src/gallium/auxiliary/vl/vl_idct.c @@ -600,10 +600,11 @@ init_source(struct vl_idct *idct, struct vl_idct_buffer *buffer) buffer->fb_state_mismatch.nr_cbufs = 1; memset(&surf_templ, 0, sizeof(surf_templ)); + surf_templ.texture = tex; surf_templ.format = tex->format; surf_templ.u.tex.first_layer = 0; surf_templ.u.tex.last_layer = 0; - buffer->fb_state_mismatch.cbufs[0] = idct->pipe->create_surface(idct->pipe, tex, &surf_templ); + buffer->fb_state_mismatch.cbufs[0] = surf_templ; buffer->viewport_mismatch.scale[0] = tex->width0; buffer->viewport_mismatch.scale[1] = tex->height0; @@ -621,7 +622,7 @@ cleanup_source(struct vl_idct_buffer *buffer) { assert(buffer); - pipe_surface_reference(&buffer->fb_state_mismatch.cbufs[0], NULL); + memset(&buffer->fb_state_mismatch.cbufs[0], 0, sizeof(struct pipe_surface)); pipe_sampler_view_reference(&buffer->sampler_views.individual.source, NULL); } @@ -643,13 +644,10 @@ init_intermediate(struct vl_idct *idct, struct vl_idct_buffer *buffer) for(i = 0; i < idct->nr_of_render_targets; ++i) { memset(&surf_templ, 0, sizeof(surf_templ)); surf_templ.format = tex->format; + surf_templ.texture = tex; surf_templ.u.tex.first_layer = i; surf_templ.u.tex.last_layer = i; - buffer->fb_state.cbufs[i] = idct->pipe->create_surface( - idct->pipe, tex, &surf_templ); - - if (!buffer->fb_state.cbufs[i]) - goto error_surfaces; + buffer->fb_state.cbufs[i] = surf_templ; } buffer->viewport.scale[0] = tex->width0; @@ -661,23 +659,14 @@ init_intermediate(struct vl_idct *idct, struct vl_idct_buffer *buffer) buffer->viewport.swizzle_w = PIPE_VIEWPORT_SWIZZLE_POSITIVE_W; return true; - -error_surfaces: - for(i = 0; i < idct->nr_of_render_targets; ++i) - pipe_surface_reference(&buffer->fb_state.cbufs[i], NULL); - - return false; } static void cleanup_intermediate(struct vl_idct_buffer *buffer) { - unsigned i; - assert(buffer); - for(i = 0; i < PIPE_MAX_COLOR_BUFS; ++i) - pipe_surface_reference(&buffer->fb_state.cbufs[i], NULL); + memset(buffer->fb_state.cbufs, 0, sizeof(buffer->fb_state.cbufs)); pipe_sampler_view_reference(&buffer->sampler_views.individual.intermediate, NULL); } diff --git a/src/gallium/auxiliary/vl/vl_matrix_filter.c b/src/gallium/auxiliary/vl/vl_matrix_filter.c index 09a72ba50ed..7ca86aa4a40 100644 --- a/src/gallium/auxiliary/vl/vl_matrix_filter.c +++ b/src/gallium/auxiliary/vl/vl_matrix_filter.c @@ -295,7 +295,7 @@ vl_matrix_filter_render(struct vl_matrix_filter *filter, fb_state.width = pipe_surface_width(dst); fb_state.height = pipe_surface_height(dst); fb_state.nr_cbufs = 1; - fb_state.cbufs[0] = dst; + fb_state.cbufs[0] = *dst; filter->pipe->bind_rasterizer_state(filter->pipe, filter->rs_state); filter->pipe->bind_blend_state(filter->pipe, filter->blend); diff --git a/src/gallium/auxiliary/vl/vl_mc.c b/src/gallium/auxiliary/vl/vl_mc.c index c69f1ee910e..ef420592e77 100644 --- a/src/gallium/auxiliary/vl/vl_mc.c +++ b/src/gallium/auxiliary/vl/vl_mc.c @@ -568,7 +568,7 @@ vl_mc_init_buffer(struct vl_mc *renderer, struct vl_mc_buffer *buffer) buffer->viewport.swizzle_w = PIPE_VIEWPORT_SWIZZLE_POSITIVE_W; buffer->fb_state.nr_cbufs = 1; - buffer->fb_state.zsbuf = NULL; + memset(&buffer->fb_state.zsbuf, 0, sizeof(buffer->fb_state.zsbuf)); return true; } @@ -591,7 +591,7 @@ vl_mc_set_surface(struct vl_mc_buffer *buffer, struct pipe_surface *surface) buffer->fb_state.width = pipe_surface_width(surface); buffer->fb_state.height = pipe_surface_height(surface); - buffer->fb_state.cbufs[0] = surface; + buffer->fb_state.cbufs[0] = *surface; } static void diff --git a/src/gallium/auxiliary/vl/vl_median_filter.c b/src/gallium/auxiliary/vl/vl_median_filter.c index d9c89419022..3a578726d8c 100644 --- a/src/gallium/auxiliary/vl/vl_median_filter.c +++ b/src/gallium/auxiliary/vl/vl_median_filter.c @@ -413,7 +413,7 @@ vl_median_filter_render(struct vl_median_filter *filter, fb_state.width = pipe_surface_width(dst); fb_state.height = pipe_surface_height(dst); fb_state.nr_cbufs = 1; - fb_state.cbufs[0] = dst; + fb_state.cbufs[0] = *dst; filter->pipe->bind_rasterizer_state(filter->pipe, filter->rs_state); filter->pipe->bind_blend_state(filter->pipe, filter->blend); diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c index adbdd5e174d..d9176a65bfa 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c +++ b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c @@ -122,7 +122,7 @@ get_video_buffer_private(struct vl_mpeg12_decoder *dec, struct pipe_video_buffer struct pipe_context *pipe = dec->context; struct video_buffer_private *priv; struct pipe_sampler_view **sv; - struct pipe_surface **surf; + struct pipe_surface *surf; unsigned i; priv = vl_video_buffer_get_associated_data(buf, &dec->base); @@ -140,9 +140,7 @@ get_video_buffer_private(struct vl_mpeg12_decoder *dec, struct pipe_video_buffer priv->sampler_view_planes[i] = pipe->create_sampler_view(pipe, sv[i]->texture, sv[i]); surf = buf->get_surfaces(buf); - for (i = 0; i < VL_MAX_SURFACES; ++i) - if (surf[i]) - priv->surfaces[i] = pipe->create_surface(pipe, surf[i]->texture, surf[i]); + memcpy(priv->surfaces, surf, sizeof(priv->surfaces)); vl_video_buffer_set_associated_data(buf, &dec->base, priv, destroy_video_buffer_private); @@ -166,7 +164,7 @@ init_zscan_buffer(struct vl_mpeg12_decoder *dec, struct vl_mpeg12_buffer *buffer { struct pipe_resource *res, res_tmpl; struct pipe_sampler_view sv_tmpl; - struct pipe_surface **destination; + struct pipe_surface *destination; unsigned i; @@ -200,12 +198,9 @@ init_zscan_buffer(struct vl_mpeg12_decoder *dec, struct vl_mpeg12_buffer *buffer else destination = dec->mc_source->get_surfaces(dec->mc_source); - if (!destination) - goto error_surface; - for (i = 0; i < VL_NUM_COMPONENTS; ++i) if (!vl_zscan_init_buffer(i == 0 ? &dec->zscan_y : &dec->zscan_c, - &buffer->zscan[i], buffer->zscan_source, destination[i])) + &buffer->zscan[i], buffer->zscan_source, &destination[i])) goto error_plane; return true; @@ -214,7 +209,6 @@ error_plane: for (; i > 0; --i) vl_zscan_cleanup_buffer(&buffer->zscan[i - 1]); -error_surface: error_sampler: pipe_sampler_view_reference(&buffer->zscan_source, NULL); diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.c b/src/gallium/auxiliary/vl/vl_video_buffer.c index 7ecd38f5b53..db59ea10837 100644 --- a/src/gallium/auxiliary/vl/vl_video_buffer.c +++ b/src/gallium/auxiliary/vl/vl_video_buffer.c @@ -219,9 +219,6 @@ vl_video_buffer_destroy(struct pipe_video_buffer *buffer) pipe_resource_reference(&buf->resources[i], NULL); } - for (i = 0; i < VL_MAX_SURFACES; ++i) - pipe_surface_reference(&buf->surfaces[i], NULL); - vl_video_buffer_set_associated_data(buffer, NULL, NULL, NULL); FREE(buffer); @@ -339,46 +336,35 @@ error: return NULL; } -static struct pipe_surface ** -vl_video_buffer_surfaces(struct pipe_video_buffer *buffer) +static struct pipe_surface * +vl_video_buffer_get_surfaces(struct pipe_video_buffer *buffer) { struct vl_video_buffer *buf = (struct vl_video_buffer *)buffer; - struct pipe_surface surf_templ; - struct pipe_context *pipe; + return &buf->surfaces[0]; +} + +static void +vl_video_buffer_surfaces(struct vl_video_buffer *buf) +{ unsigned i, j, array_size, surf; assert(buf); - pipe = buf->base.context; - - array_size = buffer->interlaced ? 2 : 1; + array_size = buf->base.interlaced ? 2 : 1; for (i = 0, surf = 0; i < VL_NUM_COMPONENTS; ++i) { for (j = 0; j < array_size; ++j, ++surf) { assert(surf < VL_MAX_SURFACES); if (!buf->resources[i]) { - pipe_surface_reference(&buf->surfaces[surf], NULL); + memset(&buf->surfaces[surf], 0, sizeof(buf->surfaces[0])); continue; } - if (!buf->surfaces[surf]) { - memset(&surf_templ, 0, sizeof(surf_templ)); - surf_templ.format = vl_video_buffer_surface_format(buf->resources[i]->format); - surf_templ.u.tex.first_layer = surf_templ.u.tex.last_layer = j; - buf->surfaces[surf] = pipe->create_surface(pipe, buf->resources[i], &surf_templ); - if (!buf->surfaces[surf]) - goto error; - } + buf->surfaces[surf].texture = buf->resources[i]; + buf->surfaces[surf].format = vl_video_buffer_surface_format(buf->resources[i]->format); + buf->surfaces[surf].u.tex.first_layer = buf->surfaces[surf].u.tex.last_layer = j; } } - - return buf->surfaces; - -error: - for (i = 0; i < VL_MAX_SURFACES; ++i ) - pipe_surface_reference(&buf->surfaces[i], NULL); - - return NULL; } struct pipe_video_buffer * @@ -495,7 +481,7 @@ vl_video_buffer_create_ex2(struct pipe_context *pipe, buffer->base.get_resources = vl_video_buffer_resources; buffer->base.get_sampler_view_planes = vl_video_buffer_sampler_view_planes; buffer->base.get_sampler_view_components = vl_video_buffer_sampler_view_components; - buffer->base.get_surfaces = vl_video_buffer_surfaces; + buffer->base.get_surfaces = vl_video_buffer_get_surfaces; for (i = 0; i < num_planes; ++i) buffer->resources[i] = resources[i]; @@ -506,6 +492,8 @@ vl_video_buffer_create_ex2(struct pipe_context *pipe, pipe_resource_reference(&res, NULL); } + vl_video_buffer_surfaces(buffer); + return &buffer->base; } diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.h b/src/gallium/auxiliary/vl/vl_video_buffer.h index d71d9c20be8..2440e1edd4f 100644 --- a/src/gallium/auxiliary/vl/vl_video_buffer.h +++ b/src/gallium/auxiliary/vl/vl_video_buffer.h @@ -45,7 +45,7 @@ struct vl_video_buffer struct pipe_sampler_view *sampler_view_planes[VL_NUM_COMPONENTS]; struct pipe_sampler_view *sampler_view_components[VL_NUM_COMPONENTS]; unsigned num_sampler_view_components; - struct pipe_surface *surfaces[VL_MAX_SURFACES]; + struct pipe_surface surfaces[VL_MAX_SURFACES]; }; static inline void diff --git a/src/gallium/auxiliary/vl/vl_zscan.c b/src/gallium/auxiliary/vl/vl_zscan.c index 2493f64993c..e38963e1770 100644 --- a/src/gallium/auxiliary/vl/vl_zscan.c +++ b/src/gallium/auxiliary/vl/vl_zscan.c @@ -438,7 +438,7 @@ vl_zscan_init_buffer(struct vl_zscan *zscan, struct vl_zscan_buffer *buffer, buffer->fb_state.width = pipe_surface_width(dst); buffer->fb_state.height = pipe_surface_height(dst); buffer->fb_state.nr_cbufs = 1; - pipe_surface_reference(&buffer->fb_state.cbufs[0], dst); + buffer->fb_state.cbufs[0] = *dst; memset(&res_tmpl, 0, sizeof(res_tmpl)); res_tmpl.target = PIPE_TEXTURE_3D; @@ -473,7 +473,7 @@ vl_zscan_cleanup_buffer(struct vl_zscan_buffer *buffer) pipe_sampler_view_reference(&buffer->src, NULL); pipe_sampler_view_reference(&buffer->layout, NULL); pipe_sampler_view_reference(&buffer->quant, NULL); - pipe_surface_reference(&buffer->fb_state.cbufs[0], NULL); + memset(&buffer->fb_state.cbufs[0], 0, sizeof(struct pipe_surface)); } void diff --git a/src/gallium/drivers/asahi/agx_batch.c b/src/gallium/drivers/asahi/agx_batch.c index 20274478b47..f3a92298238 100644 --- a/src/gallium/drivers/asahi/agx_batch.c +++ b/src/gallium/drivers/asahi/agx_batch.c @@ -831,12 +831,12 @@ agx_batch_submit(struct agx_context *ctx, struct agx_batch *batch, struct pipe_framebuffer_state *fb = &batch->key; for (unsigned i = 0; i < fb->nr_cbufs; ++i) { - if (fb->cbufs[i]) - asahi_add_attachment(&att, agx_resource(fb->cbufs[i]->texture)); + if (fb->cbufs[i].texture) + asahi_add_attachment(&att, agx_resource(fb->cbufs[i].texture)); } - if (fb->zsbuf) { - struct agx_resource *rsrc = agx_resource(fb->zsbuf->texture); + if (fb->zsbuf.texture) { + struct agx_resource *rsrc = agx_resource(fb->zsbuf.texture); asahi_add_attachment(&att, rsrc); if (rsrc->separate_stencil) diff --git a/src/gallium/drivers/asahi/agx_pipe.c b/src/gallium/drivers/asahi/agx_pipe.c index 9b42bf37073..f06bea254ee 100644 --- a/src/gallium/drivers/asahi/agx_pipe.c +++ b/src/gallium/drivers/asahi/agx_pipe.c @@ -1089,7 +1089,7 @@ agx_clear(struct pipe_context *pctx, unsigned buffers, /* Clear colour must be clamped to properly handle signed ints. */ union pipe_color_union clamped = - util_clamp_color(batch->key.cbufs[rt]->format, color); + util_clamp_color(batch->key.cbufs[rt].format, color); batch->uploaded_clear_color[rt] = agx_pool_upload_aligned( &batch->pool, clamped.f, sizeof(clamped.f), 16); @@ -1241,16 +1241,16 @@ agx_cmdbuf(struct agx_device *dev, struct drm_asahi_cmd_render *c, c->isp_bgobjvals = 0x300; struct agx_resource *zres = NULL, *sres = NULL; - struct pipe_surface *zsbuf = framebuffer->zsbuf; + struct pipe_surface *zsbuf = &framebuffer->zsbuf; - if (framebuffer->zsbuf) { + if (framebuffer->zsbuf.texture) { agx_pack(&c->isp_zls_pixels, CR_ISP_ZLS_PIXELS, cfg) { cfg.x = c->width_px; cfg.y = c->height_px; } } - if (zsbuf) { + if (zsbuf->texture) { struct agx_resource *zsres = agx_resource(zsbuf->texture); const struct util_format_description *desc = util_format_description(zsres->layout.format); @@ -1571,10 +1571,10 @@ agx_flush_render(struct agx_context *ctx, struct agx_batch *batch, agx_tilebuffer_spills(&batch->tilebuffer_layout); for (unsigned i = 0; i < batch->key.nr_cbufs; ++i) { - struct pipe_surface *surf = batch->key.cbufs[i]; + const struct pipe_surface *surf = &batch->key.cbufs[i]; clear_pipeline_textures |= - surf && surf->texture && !(batch->clear & (PIPE_CLEAR_COLOR0 << i)); + surf->texture && !(batch->clear & (PIPE_CLEAR_COLOR0 << i)); } /* Scissor and depth bias arrays are staged to dynamic arrays on the CPU. At @@ -1694,13 +1694,13 @@ agx_invalidate_resource(struct pipe_context *pctx, struct agx_batch *batch = agx_get_batch(ctx); /* Handle the glInvalidateFramebuffer case */ - if (batch->key.zsbuf && batch->key.zsbuf->texture == resource) + if (batch->key.zsbuf.texture == resource) batch->resolve &= ~PIPE_CLEAR_DEPTHSTENCIL; for (unsigned i = 0; i < batch->key.nr_cbufs; ++i) { - struct pipe_surface *surf = batch->key.cbufs[i]; + const struct pipe_surface *surf = &batch->key.cbufs[i]; - if (surf && surf->texture == resource) + if (surf->texture == resource) batch->resolve &= ~(PIPE_CLEAR_COLOR0 << i); } } diff --git a/src/gallium/drivers/asahi/agx_state.c b/src/gallium/drivers/asahi/agx_state.c index 995c95a395f..9c5b3372737 100644 --- a/src/gallium/drivers/asahi/agx_state.c +++ b/src/gallium/drivers/asahi/agx_state.c @@ -75,7 +75,7 @@ void agx_legalize_compression(struct agx_context *ctx, struct agx_resource *rsrc, enum pipe_format format) { - if (!ail_is_view_compatible(&rsrc->layout, format)) { + if (rsrc && !ail_is_view_compatible(&rsrc->layout, format)) { agx_decompress(ctx, rsrc, "Incompatible formats"); } } @@ -861,9 +861,6 @@ static struct pipe_surface * agx_create_surface(struct pipe_context *ctx, struct pipe_resource *texture, const struct pipe_surface *surf_tmpl) { - agx_legalize_compression(agx_context(ctx), agx_resource(texture), - surf_tmpl->format); - struct pipe_surface *surface = CALLOC_STRUCT(pipe_surface); if (!surface) @@ -1101,6 +1098,16 @@ agx_set_framebuffer_state(struct pipe_context *pctx, return; util_copy_framebuffer_state(&ctx->framebuffer, state); + + for (unsigned i = 0; i < state->nr_cbufs; ++i) { + agx_legalize_compression(ctx, + agx_resource(ctx->framebuffer.cbufs[i].texture), + ctx->framebuffer.cbufs[i].format); + } + + agx_legalize_compression(ctx, agx_resource(ctx->framebuffer.zsbuf.texture), + ctx->framebuffer.zsbuf.format); + ctx->batch = NULL; agx_dirty_all(ctx); } @@ -1111,7 +1118,7 @@ agx_set_framebuffer_state(struct pipe_context *pctx, * constructs the internal pipe_image_view used. */ static struct pipe_image_view -image_view_for_surface(struct pipe_surface *surf) +image_view_for_surface(const struct pipe_surface *surf) { return (struct pipe_image_view){ .resource = surf->texture, @@ -1128,7 +1135,7 @@ image_view_for_surface(struct pipe_surface *surf) /* Similarly, to read render targets, surfaces are bound as textures */ static struct pipe_sampler_view -sampler_view_for_surface(struct pipe_surface *surf) +sampler_view_for_surface(const struct pipe_surface *surf) { bool layered = surf->u.tex.last_layer > surf->u.tex.first_layer; @@ -2348,9 +2355,7 @@ agx_update_fs(struct agx_batch *batch) key.nr_samples = nr_samples; for (unsigned i = 0; i < batch->key.nr_cbufs; ++i) { - struct pipe_surface *surf = batch->key.cbufs[i]; - - key.rt_formats[i] = surf ? surf->format : PIPE_FORMAT_NONE; + key.rt_formats[i] = batch->key.cbufs[i].format; } } @@ -2387,9 +2392,7 @@ agx_update_fs(struct agx_batch *batch) }; for (unsigned i = 0; i < PIPE_MAX_COLOR_BUFS; ++i) { - struct pipe_surface *surf = batch->key.cbufs[i]; - - link_key.epilog.fs.rt_formats[i] = surf ? surf->format : PIPE_FORMAT_NONE; + link_key.epilog.fs.rt_formats[i] = batch->key.cbufs[i].format; link_key.epilog.fs.remap[i] = link_key.epilog.fs.link.broadcast_rt0 ? 0 : i; } @@ -2736,8 +2739,8 @@ agx_upload_spilled_rt_descriptors(struct agx_texture_packed *out, struct agx_texture_packed *texture = out + (2 * rt); struct agx_pbe_packed *pbe = (struct agx_pbe_packed *)(texture + 1); - struct pipe_surface *surf = batch->key.cbufs[rt]; - if (!surf) + const struct pipe_surface *surf = &batch->key.cbufs[rt]; + if (!surf->texture) continue; struct agx_resource *rsrc = agx_resource(surf->texture); @@ -3124,9 +3127,9 @@ agx_build_bg_eot(struct agx_batch *batch, bool store, bool partial_render) !store; for (unsigned rt = 0; rt < PIPE_MAX_COLOR_BUFS; ++rt) { - struct pipe_surface *surf = batch->key.cbufs[rt]; + const struct pipe_surface *surf = &batch->key.cbufs[rt]; - if (surf == NULL) + if (surf->texture == NULL) continue; if (store) { @@ -3178,8 +3181,8 @@ agx_build_bg_eot(struct agx_batch *batch, bool store, bool partial_render) struct agx_ptr texture = agx_pool_alloc_aligned(&batch->pool, AGX_TEXTURE_LENGTH, 64); - struct pipe_surface *surf = batch->key.cbufs[rt]; - assert(surf != NULL && "cannot load nonexistent attachment"); + const struct pipe_surface *surf = &batch->key.cbufs[rt]; + assert(surf->texture != NULL && "cannot load nonexistent attachment"); struct agx_resource *rsrc = agx_resource(surf->texture); struct pipe_sampler_view sampler_view = sampler_view_for_surface(surf); @@ -3200,7 +3203,7 @@ agx_build_bg_eot(struct agx_batch *batch, bool store, bool partial_render) uniforms = MAX2(uniforms, 4 + (8 * rt) + 8); } else if (key.op[rt] == AGX_EOT_STORE) { struct pipe_image_view view = - image_view_for_surface(batch->key.cbufs[rt]); + image_view_for_surface(&batch->key.cbufs[rt]); struct agx_ptr pbe = agx_pool_alloc_aligned(&batch->pool, AGX_PBE_LENGTH, 256); @@ -3403,9 +3406,7 @@ agx_batch_init_state(struct agx_batch *batch) /* Choose a tilebuffer layout given the framebuffer key */ enum pipe_format formats[PIPE_MAX_COLOR_BUFS] = {0}; for (unsigned i = 0; i < batch->key.nr_cbufs; ++i) { - struct pipe_surface *surf = batch->key.cbufs[i]; - if (surf) - formats[i] = surf->format; + formats[i] = batch->key.cbufs[i].format; } batch->tilebuffer_layout = agx_build_tilebuffer_layout( @@ -3424,8 +3425,8 @@ agx_batch_init_state(struct agx_batch *batch) if (!batch->tilebuffer_layout.spilled[i]) continue; - struct pipe_surface *surf = batch->key.cbufs[i]; - if (!surf) + struct pipe_surface *surf = &batch->key.cbufs[i]; + if (!surf->texture) continue; struct agx_resource *rsrc = agx_resource(surf->texture); @@ -3443,9 +3444,9 @@ agx_batch_init_state(struct agx_batch *batch) } } - if (batch->key.zsbuf) { - unsigned level = batch->key.zsbuf->u.tex.level; - struct agx_resource *rsrc = agx_resource(batch->key.zsbuf->texture); + if (batch->key.zsbuf.texture) { + unsigned level = batch->key.zsbuf.u.tex.level; + struct agx_resource *rsrc = agx_resource(batch->key.zsbuf.texture); agx_batch_writes(batch, rsrc, level); @@ -3454,9 +3455,9 @@ agx_batch_init_state(struct agx_batch *batch) } for (unsigned i = 0; i < batch->key.nr_cbufs; ++i) { - if (batch->key.cbufs[i]) { - struct agx_resource *rsrc = agx_resource(batch->key.cbufs[i]->texture); - unsigned level = batch->key.cbufs[i]->u.tex.level; + if (batch->key.cbufs[i].texture) { + struct agx_resource *rsrc = agx_resource(batch->key.cbufs[i].texture); + unsigned level = batch->key.cbufs[i].u.tex.level; if (agx_resource_valid(rsrc, level)) batch->load |= PIPE_CLEAR_COLOR0 << i; @@ -4834,7 +4835,7 @@ agx_legalize_feedback_loop_surf(struct agx_context *ctx, struct agx_resource *rsrc, struct pipe_surface *surf, unsigned bit) { - if (!surf || agx_resource(surf->texture) != rsrc || !rsrc->layout.compressed) + if (agx_resource(surf->texture) != rsrc || !rsrc->layout.compressed) return; /* Decompress if we can and shadow if we can't. */ @@ -4882,11 +4883,11 @@ agx_legalize_feedback_loops(struct agx_context *ctx) for (unsigned cb = 0; cb < ctx->framebuffer.nr_cbufs; ++cb) { agx_legalize_feedback_loop_surf( - ctx, rsrc, ctx->framebuffer.cbufs[cb], PIPE_CLEAR_COLOR0 << i); + ctx, rsrc, &ctx->framebuffer.cbufs[cb], PIPE_CLEAR_COLOR0 << i); } /* TODO: Separate stencil? */ - agx_legalize_feedback_loop_surf(ctx, rsrc, ctx->framebuffer.zsbuf, + agx_legalize_feedback_loop_surf(ctx, rsrc, &ctx->framebuffer.zsbuf, PIPE_CLEAR_DEPTH); } } diff --git a/src/gallium/drivers/crocus/crocus_clear.c b/src/gallium/drivers/crocus/crocus_clear.c index 7743807d66e..8a7b550570a 100644 --- a/src/gallium/drivers/crocus/crocus_clear.c +++ b/src/gallium/drivers/crocus/crocus_clear.c @@ -643,7 +643,7 @@ crocus_clear(struct pipe_context *ctx, util_framebuffer_get_num_layers(cso_fb), buffers & PIPE_CLEAR_DEPTHSTENCIL, p_color, depth, stencil, false); } else { - struct pipe_surface *psurf = cso_fb->zsbuf; + const struct pipe_surface *psurf = &cso_fb->zsbuf; box.depth = psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1; box.z = psurf->u.tex.first_layer; @@ -661,7 +661,7 @@ crocus_clear(struct pipe_context *ctx, for (unsigned i = 0; i < cso_fb->nr_cbufs; i++) { if (buffers & (PIPE_CLEAR_COLOR0 << i)) { - struct pipe_surface *psurf = cso_fb->cbufs[i]; + struct pipe_surface *psurf = ice->state.fb_cbufs[i]; struct crocus_surface *isurf = (void *) psurf; box.depth = psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1, box.z = psurf->u.tex.first_layer, diff --git a/src/gallium/drivers/crocus/crocus_context.c b/src/gallium/drivers/crocus/crocus_context.c index 526ffd00b64..db084a9bac9 100644 --- a/src/gallium/drivers/crocus/crocus_context.c +++ b/src/gallium/drivers/crocus/crocus_context.c @@ -201,6 +201,9 @@ crocus_destroy_context(struct pipe_context *ctx) util_blitter_destroy(ice->blitter); screen->vtbl.destroy_state(ice); + util_framebuffer_init(ctx, NULL, ice->state.fb_cbufs, &ice->state.fb_zsbuf); + util_unreference_framebuffer_state(&ice->state.framebuffer); + for (unsigned i = 0; i < ARRAY_SIZE(ice->shaders.scratch_bos); i++) { for (unsigned j = 0; j < ARRAY_SIZE(ice->shaders.scratch_bos[i]); j++) crocus_bo_unreference(ice->shaders.scratch_bos[i][j]); diff --git a/src/gallium/drivers/crocus/crocus_context.h b/src/gallium/drivers/crocus/crocus_context.h index eea21ff55b3..e8bc5e88d42 100644 --- a/src/gallium/drivers/crocus/crocus_context.h +++ b/src/gallium/drivers/crocus/crocus_context.h @@ -35,6 +35,7 @@ #include "crocus_resource.h" #include "crocus_screen.h" #include "util/u_blitter.h" +#include "util/u_framebuffer.h" struct crocus_bo; struct crocus_context; @@ -571,6 +572,7 @@ struct crocus_context { struct pipe_viewport_state viewports[CROCUS_MAX_VIEWPORTS]; struct pipe_scissor_state scissors[CROCUS_MAX_VIEWPORTS]; struct pipe_stencil_ref stencil_ref; + PIPE_FB_SURFACES; //STOP USING THIS struct pipe_framebuffer_state framebuffer; struct pipe_clip_state clip_planes; diff --git a/src/gallium/drivers/crocus/crocus_program.c b/src/gallium/drivers/crocus/crocus_program.c index 7360734da29..2e47a034336 100644 --- a/src/gallium/drivers/crocus/crocus_program.c +++ b/src/gallium/drivers/crocus/crocus_program.c @@ -2137,8 +2137,8 @@ crocus_update_compiled_clip(struct crocus_context *ice) if (offset_back || offset_front) { double mrd = 0.0; - if (ice->state.framebuffer.zsbuf) - mrd = util_get_depth_format_mrd(util_format_description(ice->state.framebuffer.zsbuf->format)); + if (ice->state.framebuffer.zsbuf.texture) + mrd = util_get_depth_format_mrd(util_format_description(ice->state.framebuffer.zsbuf.format)); key.offset_units = rs_state->offset_units * mrd * 2; key.offset_factor = rs_state->offset_scale * mrd; key.offset_clamp = rs_state->offset_clamp * mrd; diff --git a/src/gallium/drivers/crocus/crocus_resolve.c b/src/gallium/drivers/crocus/crocus_resolve.c index 9a2947978e5..98ddedf5460 100644 --- a/src/gallium/drivers/crocus/crocus_resolve.c +++ b/src/gallium/drivers/crocus/crocus_resolve.c @@ -62,7 +62,7 @@ disable_rb_aux_buffer(struct crocus_context *ice, return false; for (unsigned i = 0; i < cso_fb->nr_cbufs; i++) { - struct crocus_surface *surf = (void *) cso_fb->cbufs[i]; + struct crocus_surface *surf = (void *) ice->state.fb_cbufs[i]; if (!surf) continue; @@ -227,7 +227,7 @@ crocus_predraw_resolve_framebuffer(struct crocus_context *ice, const nir_shader *nir = ish->nir; if (ice->state.dirty & CROCUS_DIRTY_DEPTH_BUFFER) { - struct pipe_surface *zs_surf = cso_fb->zsbuf; + struct pipe_surface *zs_surf = ice->state.fb_zsbuf; if (zs_surf) { struct crocus_resource *z_res, *s_res; @@ -255,9 +255,9 @@ crocus_predraw_resolve_framebuffer(struct crocus_context *ice, if (nir->info.outputs_read != 0) { for (unsigned i = 0; i < cso_fb->nr_cbufs; i++) { - if (cso_fb->cbufs[i]) { - struct crocus_surface *surf = (void *) cso_fb->cbufs[i]; - struct crocus_resource *res = (void *) cso_fb->cbufs[i]->texture; + if (ice->state.fb_cbufs[i]) { + struct crocus_surface *surf = (void *) ice->state.fb_cbufs[i]; + struct crocus_resource *res = (void *) ice->state.fb_cbufs[i]->texture; crocus_resource_prepare_texture(ice, res, surf->view.format, surf->view.base_level, 1, @@ -269,7 +269,7 @@ crocus_predraw_resolve_framebuffer(struct crocus_context *ice, if (ice->state.stage_dirty & CROCUS_STAGE_DIRTY_BINDINGS_FS) { for (unsigned i = 0; i < cso_fb->nr_cbufs; i++) { - struct crocus_surface *surf = (void *) cso_fb->cbufs[i]; + struct crocus_surface *surf = (void *) ice->state.fb_cbufs[i]; if (!surf) continue; @@ -325,7 +325,7 @@ crocus_postdraw_update_resolve_tracking(struct crocus_context *ice, ice->state.dirty & (CROCUS_DIRTY_DEPTH_BUFFER | CROCUS_DIRTY_GEN6_WM_DEPTH_STENCIL); - struct pipe_surface *zs_surf = cso_fb->zsbuf; + struct pipe_surface *zs_surf = ice->state.fb_zsbuf; if (zs_surf) { struct crocus_resource *z_res, *s_res; crocus_get_depth_stencil_resources(devinfo, zs_surf->texture, &z_res, &s_res); @@ -363,7 +363,7 @@ crocus_postdraw_update_resolve_tracking(struct crocus_context *ice, ice->state.stage_dirty & CROCUS_STAGE_DIRTY_BINDINGS_FS; for (unsigned i = 0; i < cso_fb->nr_cbufs; i++) { - struct crocus_surface *surf = (void *) cso_fb->cbufs[i]; + struct crocus_surface *surf = (void *) ice->state.fb_cbufs[i]; if (!surf) continue; diff --git a/src/gallium/drivers/crocus/crocus_state.c b/src/gallium/drivers/crocus/crocus_state.c index d6c63f6cb7c..7a61c04a217 100644 --- a/src/gallium/drivers/crocus/crocus_state.c +++ b/src/gallium/drivers/crocus/crocus_state.c @@ -1508,8 +1508,8 @@ can_emit_logic_op(struct crocus_context *ice) /* all pre gen8 have logicop restricted to unorm */ enum pipe_format pformat = PIPE_FORMAT_NONE; for (unsigned i = 0; i < ice->state.framebuffer.nr_cbufs; i++) { - if (ice->state.framebuffer.cbufs[i]) { - pformat = ice->state.framebuffer.cbufs[i]->format; + if (ice->state.framebuffer.cbufs[i].texture) { + pformat = ice->state.framebuffer.cbufs[i].format; break; } } @@ -1859,17 +1859,17 @@ want_pma_fix(struct crocus_context *ice) * meaning the PMA signal will already be disabled). */ - if (!cso_fb->zsbuf) + if (!cso_fb->zsbuf.texture) return false; struct crocus_resource *zres, *sres; crocus_get_depth_stencil_resources(devinfo, - cso_fb->zsbuf->texture, &zres, &sres); + cso_fb->zsbuf.texture, &zres, &sres); /* 3DSTATE_DEPTH_BUFFER::SURFACE_TYPE != NULL && * 3DSTATE_DEPTH_BUFFER::HIZ Enable && */ - if (!zres || !crocus_resource_level_has_hiz(zres, cso_fb->zsbuf->u.tex.level)) + if (!zres || !crocus_resource_level_has_hiz(zres, cso_fb->zsbuf.u.tex.level)) return false; /* 3DSTATE_WM::EDSC_Mode != EDSC_PREPS */ @@ -3424,27 +3424,28 @@ crocus_set_framebuffer_state(struct pipe_context *ctx, #endif } - if (cso->zsbuf || state->zsbuf) { + if (cso->zsbuf.texture || state->zsbuf.texture) { ice->state.dirty |= CROCUS_DIRTY_DEPTH_BUFFER; /* update SF's depth buffer format */ - if (GFX_VER == 7 && cso->zsbuf) + if (GFX_VER == 7 && cso->zsbuf.texture) ice->state.dirty |= CROCUS_DIRTY_RASTER; } /* wm thread dispatch enable */ ice->state.dirty |= CROCUS_DIRTY_WM; + util_framebuffer_init(ctx, state, ice->state.fb_cbufs, &ice->state.fb_zsbuf); util_copy_framebuffer_state(cso, state); cso->samples = samples; cso->layers = layers; - if (cso->zsbuf) { + if (cso->zsbuf.texture) { struct crocus_resource *zres; struct crocus_resource *stencil_res; enum isl_aux_usage aux_usage = ISL_AUX_USAGE_NONE; - crocus_get_depth_stencil_resources(devinfo, cso->zsbuf->texture, &zres, + crocus_get_depth_stencil_resources(devinfo, cso->zsbuf.texture, &zres, &stencil_res); - if (zres && crocus_resource_level_has_hiz(zres, cso->zsbuf->u.tex.level)) { + if (zres && crocus_resource_level_has_hiz(zres, cso->zsbuf.u.tex.level)) { aux_usage = zres->aux.usage; } ice->state.hiz_usage = aux_usage; @@ -4773,7 +4774,7 @@ crocus_populate_fs_key(const struct crocus_context *ice, if (info->outputs_written & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) lookup |= ELK_WM_IZ_PS_COMPUTES_DEPTH_BIT; - if (fb->zsbuf && zsa->cso.depth_enabled) { + if (fb->zsbuf.texture && zsa->cso.depth_enabled) { lookup |= ELK_WM_IZ_DEPTH_TEST_ENABLE_BIT; if (zsa->cso.depth_writemask) @@ -4942,11 +4943,11 @@ emit_null_fb_surface(struct crocus_batch *batch, level = 0; layer = 0; - if (cso->nr_cbufs == 0 && cso->zsbuf) { - width = ((struct crocus_surface*)cso->zsbuf)->surf.logical_level0_px.width; - height = ((struct crocus_surface*)cso->zsbuf)->surf.logical_level0_px.height; - level = cso->zsbuf->u.tex.level; - layer = cso->zsbuf->u.tex.first_layer; + if (cso->nr_cbufs == 0 && ice->state.fb_zsbuf) { + width = ((struct crocus_surface*)ice->state.fb_zsbuf)->surf.logical_level0_px.width; + height = ((struct crocus_surface*)ice->state.fb_zsbuf)->surf.logical_level0_px.height; + level = cso->zsbuf.u.tex.level; + layer = cso->zsbuf.u.tex.first_layer; } emit_sized_null_surface(batch, width, height, layers, level, layer, @@ -5390,9 +5391,9 @@ crocus_populate_binding_table(struct crocus_context *ice, /* Gen4/5 can't handle blending off when a dual src blend wm is enabled. */ blend_enable = rt->blend_enable || wm_prog_data->dual_src_blend; #endif - if (cso_fb->cbufs[i]) { + if (cso_fb->cbufs[i].texture) { surf_offsets[s] = emit_surface(batch, - (struct crocus_surface *)cso_fb->cbufs[i], + (struct crocus_surface *)ice->state.fb_cbufs[i], ice->state.draw_aux_usage[i], blend_enable, write_disables); @@ -5408,9 +5409,9 @@ crocus_populate_binding_table(struct crocus_context *ice, foreach_surface_used(i, CROCUS_SURFACE_GROUP_RENDER_TARGET_READ) { struct pipe_framebuffer_state *cso_fb = &ice->state.framebuffer; - if (cso_fb->cbufs[i]) { + if (cso_fb->cbufs[i].texture) { surf_offsets[s++] = emit_rt_surface(batch, - (struct crocus_surface *)cso_fb->cbufs[i], + (struct crocus_surface *)ice->state.fb_cbufs[i], ice->state.draw_aux_usage[i]); } } @@ -7107,10 +7108,10 @@ crocus_upload_dirty_render_state(struct crocus_context *ice, sf.MultisampleRasterizationMode = MSRASTMODE_ON_PATTERN; #endif #if GFX_VER == 7 - if (ice->state.framebuffer.zsbuf) { + if (ice->state.framebuffer.zsbuf.texture) { struct crocus_resource *zres, *sres; crocus_get_depth_stencil_resources(&batch->screen->devinfo, - ice->state.framebuffer.zsbuf->texture, + ice->state.framebuffer.zsbuf.texture, &zres, &sres); /* ANV thinks that the stencil-ness doesn't matter, this is just * about handling polygon offset scaling. @@ -7443,15 +7444,15 @@ crocus_upload_dirty_render_state(struct crocus_context *ice, .mocs = crocus_mocs(NULL, isl_dev), }; - if (cso->zsbuf) { - crocus_get_depth_stencil_resources(&batch->screen->devinfo, cso->zsbuf->texture, &zres, &sres); - struct crocus_surface *zsbuf = (struct crocus_surface *)cso->zsbuf; + if (cso->zsbuf.texture) { + crocus_get_depth_stencil_resources(&batch->screen->devinfo, cso->zsbuf.texture, &zres, &sres); + struct crocus_surface *zsbuf = (struct crocus_surface *)ice->state.fb_zsbuf; if (zsbuf->align_res) { zres = (struct crocus_resource *)zsbuf->align_res; } - view.base_level = cso->zsbuf->u.tex.level; - view.base_array_layer = cso->zsbuf->u.tex.first_layer; - view.array_len = cso->zsbuf->u.tex.last_layer - cso->zsbuf->u.tex.first_layer + 1; + view.base_level = cso->zsbuf.u.tex.level; + view.base_array_layer = cso->zsbuf.u.tex.first_layer; + view.array_len = cso->zsbuf.u.tex.last_layer - cso->zsbuf.u.tex.first_layer + 1; if (zres) { view.usage |= ISL_SURF_USAGE_DEPTH_BIT; diff --git a/src/gallium/drivers/d3d12/d3d12_blit.cpp b/src/gallium/drivers/d3d12/d3d12_blit.cpp index 9350b2ff968..288f73c5944 100644 --- a/src/gallium/drivers/d3d12/d3d12_blit.cpp +++ b/src/gallium/drivers/d3d12/d3d12_blit.cpp @@ -491,11 +491,6 @@ resolve_stencil_to_temp(struct d3d12_context *ctx, struct pipe_surface dst_tmpl; util_blitter_default_dst_texture(&dst_tmpl, tmp, 0, 0); dst_tmpl.format = tmp->format; - struct pipe_surface *dst_surf = pctx->create_surface(pctx, tmp, &dst_tmpl); - if (!dst_surf) { - debug_printf("D3D12: failed to create stencil-resolve dst-surface\n"); - return NULL; - } struct pipe_sampler_view src_templ, *src_view; util_blitter_default_src_texture(ctx->blitter, &src_templ, @@ -508,13 +503,12 @@ resolve_stencil_to_temp(struct d3d12_context *ctx, util_blit_save_state(ctx); pctx->set_sampler_views(pctx, PIPE_SHADER_FRAGMENT, 0, 1, 0, &src_view); pctx->bind_sampler_states(pctx, PIPE_SHADER_FRAGMENT, 0, 1, &sampler_state); - util_blitter_custom_shader(ctx->blitter, dst_surf, - (uint16_t)pipe_surface_width(dst_surf), - (uint16_t)pipe_surface_height(dst_surf), + util_blitter_custom_shader(ctx->blitter, &dst_tmpl, + (uint16_t)pipe_surface_width(&dst_tmpl), + (uint16_t)pipe_surface_height(&dst_tmpl), get_stencil_resolve_vs(ctx), get_stencil_resolve_fs(ctx, info->src.box.height == info->dst.box.height)); util_blitter_restore_textures(ctx->blitter); - pipe_surface_reference(&dst_surf, NULL); pipe_sampler_view_reference(&src_view, NULL); return tmp; } @@ -603,7 +597,6 @@ static void blit_replicate_stencil(struct d3d12_context *ctx, const struct pipe_blit_info *info) { - struct pipe_context *pctx = &ctx->base; assert(info->mask & PIPE_MASK_S); if (D3D12_DEBUG_BLIT & d3d12_debug) @@ -616,13 +609,12 @@ blit_replicate_stencil(struct d3d12_context *ctx, util_blit(ctx, &new_info); } - struct pipe_surface *dst_view, dst_templ; + struct pipe_surface dst_templ; util_blitter_default_dst_texture(&dst_templ, info->dst.resource, info->dst.level, info->dst.box.z); - dst_view = pctx->create_surface(pctx, info->dst.resource, &dst_templ); util_blit_save_state(ctx); - util_blitter_clear_depth_stencil(ctx->blitter, dst_view, PIPE_CLEAR_STENCIL, + util_blitter_clear_depth_stencil(ctx->blitter, &dst_templ, PIPE_CLEAR_STENCIL, 0, 0, info->dst.box.x, info->dst.box.y, info->dst.box.width, info->dst.box.height); util_blit_save_state(ctx); @@ -633,8 +625,6 @@ blit_replicate_stencil(struct d3d12_context *ctx, info->src.level, &info->src.box, info->scissor_enable ? &info->scissor : NULL); - - pipe_surface_unref(pctx, &dst_view); } void diff --git a/src/gallium/drivers/d3d12/d3d12_compiler.cpp b/src/gallium/drivers/d3d12/d3d12_compiler.cpp index 0b0bfdfca47..64dbfd94d38 100644 --- a/src/gallium/drivers/d3d12/d3d12_compiler.cpp +++ b/src/gallium/drivers/d3d12/d3d12_compiler.cpp @@ -956,7 +956,7 @@ d3d12_fill_shader_key(struct d3d12_selection_context *sel_ctx, if (sel_ctx->ctx->gfx_pipeline_state.blend && sel_ctx->ctx->gfx_pipeline_state.blend->desc.RenderTarget[0].LogicOpEnable && !sel_ctx->ctx->gfx_pipeline_state.has_float_rtv) { - key->fs.cast_to_uint = util_format_is_unorm(sel_ctx->ctx->fb.cbufs[0]->format); + key->fs.cast_to_uint = util_format_is_unorm(sel_ctx->ctx->fb.cbufs[0].format); key->fs.cast_to_int = !key->fs.cast_to_uint; } if (sel_ctx->needs_point_sprite_lowering) { diff --git a/src/gallium/drivers/d3d12/d3d12_context.h b/src/gallium/drivers/d3d12/d3d12_context.h index 991fc8801e6..0dc3e941b62 100644 --- a/src/gallium/drivers/d3d12/d3d12_context.h +++ b/src/gallium/drivers/d3d12/d3d12_context.h @@ -36,6 +36,7 @@ #include "pipe/p_state.h" #include "util/list.h" #include "util/slab.h" +#include "util/u_framebuffer.h" #include "util/u_suballoc.h" #include "util/u_threaded_context.h" @@ -205,6 +206,7 @@ struct d3d12_context { struct hash_table *compute_transform_cache; struct pipe_constant_buffer cbufs[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS]; + PIPE_FB_SURFACES; //STOP USING THIS struct pipe_framebuffer_state fb; struct pipe_vertex_buffer vbs[PIPE_MAX_ATTRIBS]; D3D12_VERTEX_BUFFER_VIEW vbvs[PIPE_MAX_ATTRIBS]; diff --git a/src/gallium/drivers/d3d12/d3d12_context_common.cpp b/src/gallium/drivers/d3d12/d3d12_context_common.cpp index 75bafe5496a..42f8fe9c9fb 100644 --- a/src/gallium/drivers/d3d12/d3d12_context_common.cpp +++ b/src/gallium/drivers/d3d12/d3d12_context_common.cpp @@ -104,6 +104,7 @@ d3d12_context_destroy(struct pipe_context *pctx) if (ctx->timestamp_query) pctx->destroy_query(pctx, ctx->timestamp_query); + util_framebuffer_init(pctx, NULL, ctx->fb_cbufs, &ctx->fb_zsbuf); util_unreference_framebuffer_state(&ctx->fb); d3d12_compute_pipeline_state_cache_destroy(ctx); d3d12_root_signature_cache_destroy(ctx); diff --git a/src/gallium/drivers/d3d12/d3d12_context_graphics.cpp b/src/gallium/drivers/d3d12/d3d12_context_graphics.cpp index 64b4205acf1..ff3d49f7c37 100644 --- a/src/gallium/drivers/d3d12/d3d12_context_graphics.cpp +++ b/src/gallium/drivers/d3d12/d3d12_context_graphics.cpp @@ -1418,26 +1418,27 @@ d3d12_set_framebuffer_state(struct pipe_context *pctx, struct d3d12_context *ctx = d3d12_context(pctx); int samples = -1; - bool prev_cbufs_or_zsbuf = ctx->fb.nr_cbufs || ctx->fb.zsbuf; + bool prev_cbufs_or_zsbuf = ctx->fb.nr_cbufs || ctx->fb.zsbuf.texture; + util_framebuffer_init(pctx, state, ctx->fb_cbufs, &ctx->fb_zsbuf); util_copy_framebuffer_state(&d3d12_context(pctx)->fb, state); - bool new_cbufs_or_zsbuf = ctx->fb.nr_cbufs || ctx->fb.zsbuf; + bool new_cbufs_or_zsbuf = ctx->fb.nr_cbufs || ctx->fb.zsbuf.texture; ctx->gfx_pipeline_state.num_cbufs = state->nr_cbufs; ctx->gfx_pipeline_state.has_float_rtv = false; for (int i = 0; i < state->nr_cbufs; ++i) { - if (state->cbufs[i]) { - if (util_format_is_float(state->cbufs[i]->format)) + if (state->cbufs[i].texture) { + if (util_format_is_float(state->cbufs[i].format)) ctx->gfx_pipeline_state.has_float_rtv = true; - ctx->gfx_pipeline_state.rtv_formats[i] = d3d12_get_format(state->cbufs[i]->format); - samples = MAX2(samples, (int)state->cbufs[i]->texture->nr_samples); + ctx->gfx_pipeline_state.rtv_formats[i] = d3d12_get_format(state->cbufs[i].format); + samples = MAX2(samples, (int)state->cbufs[i].texture->nr_samples); } else { ctx->gfx_pipeline_state.rtv_formats[i] = DXGI_FORMAT_UNKNOWN; } } - if (state->zsbuf) { - ctx->gfx_pipeline_state.dsv_format = d3d12_get_resource_rt_format(state->zsbuf->format); - samples = MAX2(samples, (int)ctx->fb.zsbuf->texture->nr_samples); + if (state->zsbuf.texture) { + ctx->gfx_pipeline_state.dsv_format = d3d12_get_resource_rt_format(state->zsbuf.format); + samples = MAX2(samples, (int)ctx->fb.zsbuf.texture->nr_samples); } else ctx->gfx_pipeline_state.dsv_format = DXGI_FORMAT_UNKNOWN; @@ -1922,7 +1923,6 @@ d3d12_clear_render_target(struct pipe_context *pctx, bool render_condition_enabled) { struct d3d12_context *ctx = d3d12_context(pctx); - struct d3d12_surface *surf = d3d12_surface(psurf); if (!render_condition_enabled && ctx->current_predication) ctx->cmdlist->SetPredication(NULL, 0, D3D12_PREDICATION_OP_EQUAL_ZERO); @@ -1987,6 +1987,9 @@ d3d12_clear_render_target(struct pipe_context *pctx, } util_blitter_clear_render_target(ctx->blitter, psurf, &local_color, dstx, dsty, width, height); } else { + struct pipe_surface *tmpsurf = pctx->create_surface(pctx, psurf->texture, psurf); + struct d3d12_surface *surf = d3d12_surface(tmpsurf); + if (!(util_format_colormask(util_format_description(psurf->format)) & PIPE_MASK_A)) clear_color[3] = 1.0f; @@ -1996,9 +1999,10 @@ d3d12_clear_render_target(struct pipe_context *pctx, (int)dsty + (int)height }; ctx->cmdlist->ClearRenderTargetView(surf->desc_handle.cpu_handle, clear_color, 1, &rect); + d3d12_batch_reference_surface_texture(d3d12_current_batch(ctx), surf); + pipe_surface_unref(pctx, &tmpsurf); } - d3d12_batch_reference_surface_texture(d3d12_current_batch(ctx), surf); if (!render_condition_enabled && ctx->current_predication) { d3d12_enable_predication(ctx); @@ -2016,7 +2020,8 @@ d3d12_clear_depth_stencil(struct pipe_context *pctx, bool render_condition_enabled) { struct d3d12_context *ctx = d3d12_context(pctx); - struct d3d12_surface *surf = d3d12_surface(psurf); + struct pipe_surface *tmpsurf = pctx->create_surface(pctx, psurf->texture, psurf); + struct d3d12_surface *surf = d3d12_surface(tmpsurf); if (!render_condition_enabled && ctx->current_predication) ctx->cmdlist->SetPredication(NULL, 0, D3D12_PREDICATION_OP_EQUAL_ZERO); @@ -2044,6 +2049,7 @@ d3d12_clear_depth_stencil(struct pipe_context *pctx, if (!render_condition_enabled && ctx->current_predication) { d3d12_enable_predication(ctx); } + pipe_surface_unref(pctx, &tmpsurf); } static void @@ -2058,7 +2064,7 @@ d3d12_clear(struct pipe_context *pctx, if (buffers & PIPE_CLEAR_COLOR) { for (int i = 0; i < ctx->fb.nr_cbufs; ++i) { if (buffers & (PIPE_CLEAR_COLOR0 << i)) { - struct pipe_surface *psurf = ctx->fb.cbufs[i]; + struct pipe_surface *psurf = &ctx->fb.cbufs[i]; uint16_t width, height; pipe_surface_size(psurf, &width, &height); d3d12_clear_render_target(pctx, psurf, color, @@ -2068,8 +2074,8 @@ d3d12_clear(struct pipe_context *pctx, } } - if (buffers & PIPE_CLEAR_DEPTHSTENCIL && ctx->fb.zsbuf) { - struct pipe_surface *psurf = ctx->fb.zsbuf; + if (buffers & PIPE_CLEAR_DEPTHSTENCIL && ctx->fb.zsbuf.texture) { + struct pipe_surface *psurf = &ctx->fb.zsbuf; uint16_t width, height; pipe_surface_size(psurf, &width, &height); d3d12_clear_depth_stencil(pctx, psurf, diff --git a/src/gallium/drivers/d3d12/d3d12_draw.cpp b/src/gallium/drivers/d3d12/d3d12_draw.cpp index 26d62d1d5c6..98a9ce7a58e 100644 --- a/src/gallium/drivers/d3d12/d3d12_draw.cpp +++ b/src/gallium/drivers/d3d12/d3d12_draw.cpp @@ -939,8 +939,8 @@ d3d12_draw_vbo(struct pipe_context *pctx, } for (int i = 0; i < ctx->fb.nr_cbufs; ++i) { - if (ctx->fb.cbufs[i]) { - struct d3d12_surface *surface = d3d12_surface(ctx->fb.cbufs[i]); + if (ctx->fb_cbufs[i]) { + struct d3d12_surface *surface = d3d12_surface(ctx->fb_cbufs[i]); conversion_modes[i] = d3d12_surface_update_pre_draw(pctx, surface, d3d12_rtv_format(ctx, i)); if (conversion_modes[i] != D3D12_SURFACE_CONVERSION_NONE) ctx->cmdlist_dirty |= D3D12_DIRTY_FRAMEBUFFER; @@ -1076,7 +1076,7 @@ d3d12_draw_vbo(struct pipe_context *pctx, viewports[i].MinDepth = 0.0f; viewports[i].MaxDepth = 1.0f; } - if (ctx->fb.nr_cbufs == 0 && !ctx->fb.zsbuf) { + if (ctx->fb.nr_cbufs == 0 && !ctx->fb.zsbuf.texture) { viewports[i].TopLeftX = MAX2(0.0f, viewports[i].TopLeftX); viewports[i].TopLeftY = MAX2(0.0f, viewports[i].TopLeftY); viewports[i].Width = MIN2(ctx->fb.width, viewports[i].Width); @@ -1158,15 +1158,15 @@ d3d12_draw_vbo(struct pipe_context *pctx, D3D12_CPU_DESCRIPTOR_HANDLE render_targets[PIPE_MAX_COLOR_BUFS] = {}; D3D12_CPU_DESCRIPTOR_HANDLE *depth_desc = NULL, tmp_desc; for (int i = 0; i < ctx->fb.nr_cbufs; ++i) { - if (ctx->fb.cbufs[i]) { - struct d3d12_surface *surface = d3d12_surface(ctx->fb.cbufs[i]); + if (ctx->fb_cbufs[i]) { + struct d3d12_surface *surface = d3d12_surface(ctx->fb_cbufs[i]); render_targets[i] = d3d12_surface_get_handle(surface, conversion_modes[i]); d3d12_batch_reference_surface_texture(batch, surface); } else render_targets[i] = screen->null_rtv.cpu_handle; } - if (ctx->fb.zsbuf) { - struct d3d12_surface *surface = d3d12_surface(ctx->fb.zsbuf); + if (ctx->fb_zsbuf) { + struct d3d12_surface *surface = d3d12_surface(ctx->fb_zsbuf); tmp_desc = surface->desc_handle.cpu_handle; d3d12_batch_reference_surface_texture(batch, surface); depth_desc = &tmp_desc; @@ -1199,7 +1199,7 @@ d3d12_draw_vbo(struct pipe_context *pctx, ctx->cmdlist->SOSetTargets(0, 4, so_buffer_views); for (int i = 0; i < ctx->fb.nr_cbufs; ++i) { - struct pipe_surface *psurf = ctx->fb.cbufs[i]; + struct pipe_surface *psurf = ctx->fb_cbufs[i]; if (!psurf) continue; @@ -1208,8 +1208,8 @@ d3d12_draw_vbo(struct pipe_context *pctx, transition_surface_subresources_state(ctx, psurf, pres, D3D12_RESOURCE_STATE_RENDER_TARGET); } - if (ctx->fb.zsbuf) { - struct pipe_surface *psurf = ctx->fb.zsbuf; + if (ctx->fb_zsbuf) { + struct pipe_surface *psurf = ctx->fb_zsbuf; transition_surface_subresources_state(ctx, psurf, psurf->texture, D3D12_RESOURCE_STATE_DEPTH_WRITE); } @@ -1272,8 +1272,8 @@ d3d12_draw_vbo(struct pipe_context *pctx, ctx->shader_dirty[i] = 0; for (int i = 0; i < ctx->fb.nr_cbufs; ++i) { - if (ctx->fb.cbufs[i]) { - struct d3d12_surface *surface = d3d12_surface(ctx->fb.cbufs[i]); + if (ctx->fb_cbufs[i]) { + struct d3d12_surface *surface = d3d12_surface(ctx->fb_cbufs[i]); d3d12_surface_update_post_draw(pctx, surface, conversion_modes[i]); } } diff --git a/src/gallium/drivers/d3d12/d3d12_video_buffer.cpp b/src/gallium/drivers/d3d12/d3d12_video_buffer.cpp index c2d67268599..b0e842534b3 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_buffer.cpp +++ b/src/gallium/drivers/d3d12/d3d12_video_buffer.cpp @@ -34,6 +34,7 @@ #include "util/u_video.h" #include "vl/vl_video_buffer.h" #include "util/u_sampler.h" +#include "util/u_surface.h" #include "frontend/winsys_handle.h" #include "d3d12_format.h" #include "d3d12_screen.h" @@ -234,12 +235,6 @@ d3d12_video_buffer_destroy(struct pipe_video_buffer *buffer) pD3D12VideoBuffer->base.associated_data = nullptr; } - for (uint i = 0; i < pD3D12VideoBuffer->surfaces.size(); ++i) { - if (pD3D12VideoBuffer->surfaces[i] != NULL) { - pipe_surface_reference(&pD3D12VideoBuffer->surfaces[i], NULL); - } - } - for (uint i = 0; i < pD3D12VideoBuffer->sampler_view_planes.size(); ++i) { if (pD3D12VideoBuffer->sampler_view_planes[i] != NULL) { pipe_sampler_view_reference(&pD3D12VideoBuffer->sampler_view_planes[i], NULL); @@ -265,13 +260,12 @@ d3d12_video_buffer_destroy_associated_data(void *associated_data) /** * get an individual surfaces for each plane */ -struct pipe_surface ** +struct pipe_surface * d3d12_video_buffer_get_surfaces(struct pipe_video_buffer *buffer) { assert(buffer); struct d3d12_video_buffer *pD3D12VideoBuffer = (struct d3d12_video_buffer *) buffer; struct pipe_context * pipe = pD3D12VideoBuffer->base.context; - struct pipe_surface surface_template = {}; // DPB buffers don't support views if ((pD3D12VideoBuffer->base.bind & PIPE_BIND_VIDEO_DECODE_DPB) || @@ -281,11 +275,6 @@ d3d12_video_buffer_get_surfaces(struct pipe_video_buffer *buffer) if (!pipe->create_surface) return nullptr; - // Some video frameworks iterate over [0..VL_MAX_SURFACES) and ignore the nullptr entries - // So we have to null initialize the other surfaces not used from [num_planes..VL_MAX_SURFACES) - // Like in src/gallium/frontends/va/surface.c - pD3D12VideoBuffer->surfaces.resize(VL_MAX_SURFACES, nullptr); - // pCurPlaneResource refers to the planar resource, not the overall resource. // in d3d12_resource this is handled by having a linked list of planes with // d3dRes->base.next ptr to next plane resource @@ -293,28 +282,24 @@ d3d12_video_buffer_get_surfaces(struct pipe_video_buffer *buffer) struct pipe_resource *pCurPlaneResource = &pD3D12VideoBuffer->texture->base.b; for (uint PlaneSlice = 0; PlaneSlice < pD3D12VideoBuffer->num_planes; ++PlaneSlice) { - if (!pD3D12VideoBuffer->surfaces[PlaneSlice]) { - memset(&surface_template, 0, sizeof(surface_template)); - surface_template.format = - util_format_get_plane_format(pD3D12VideoBuffer->texture->overall_format, PlaneSlice); + struct pipe_surface surface_template = {}; + surface_template.format = util_format_get_plane_format(pD3D12VideoBuffer->texture->overall_format, PlaneSlice); + surface_template.texture = pCurPlaneResource; - pD3D12VideoBuffer->surfaces[PlaneSlice] = - pipe->create_surface(pipe, pCurPlaneResource, &surface_template); + if (!pipe->screen->is_format_supported(pipe->screen, surface_template.format, PIPE_TEXTURE_2D, + 0, 0, PIPE_BIND_RENDER_TARGET)) + goto error; - if (!pD3D12VideoBuffer->surfaces[PlaneSlice]) { - goto error; - } - } + pD3D12VideoBuffer->surfaces[PlaneSlice] = surface_template; pCurPlaneResource = pCurPlaneResource->next; } - return pD3D12VideoBuffer->surfaces.data(); + for (uint i = pD3D12VideoBuffer->num_planes; i < VL_MAX_SURFACES; i++) + memset(&pD3D12VideoBuffer->surfaces[i], 0, sizeof(struct pipe_surface)); + + return pD3D12VideoBuffer->surfaces; error: - for (uint PlaneSlice = 0; PlaneSlice < pD3D12VideoBuffer->num_planes; ++PlaneSlice) { - pipe_surface_reference(&pD3D12VideoBuffer->surfaces[PlaneSlice], NULL); - } - return nullptr; } diff --git a/src/gallium/drivers/d3d12/d3d12_video_buffer.h b/src/gallium/drivers/d3d12/d3d12_video_buffer.h index 77e552efbfd..378bfb85bba 100644 --- a/src/gallium/drivers/d3d12/d3d12_video_buffer.h +++ b/src/gallium/drivers/d3d12/d3d12_video_buffer.h @@ -27,6 +27,7 @@ #include "pipe/p_context.h" #include "pipe/p_video_codec.h" +#include "vl/vl_defines.h" #include #include "d3d12_video_types.h" @@ -77,7 +78,7 @@ d3d12_video_buffer_get_sampler_view_components(struct pipe_video_buffer *buffer) /** * get an individual surfaces for each plane */ -struct pipe_surface ** +struct pipe_surface * d3d12_video_buffer_get_surfaces(struct pipe_video_buffer *buffer); /* @@ -94,7 +95,7 @@ struct d3d12_video_buffer pipe_video_buffer base; struct d3d12_resource * texture = nullptr; uint num_planes = 0; - std::vector surfaces; + struct pipe_surface surfaces[VL_MAX_SURFACES]; std::vector sampler_view_planes; std::vector sampler_view_components; diff --git a/src/gallium/drivers/etnaviv/etnaviv_blend.c b/src/gallium/drivers/etnaviv/etnaviv_blend.c index 8d8dba15ecf..02ed2e618fc 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_blend.c +++ b/src/gallium/drivers/etnaviv/etnaviv_blend.c @@ -122,7 +122,7 @@ etna_update_blend(struct etna_context *ctx) unsigned current_rt = 0; for (unsigned i = 0; i < pfb->nr_cbufs; i++) { - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; const struct pipe_rt_blend_state *rt; @@ -133,7 +133,7 @@ etna_update_blend(struct etna_context *ctx) else rt = &pblend->rt[0]; - if (translate_pe_format_rb_swap(pfb->cbufs[i]->format)) { + if (translate_pe_format_rb_swap(pfb->cbufs[i].format)) { colormask = rt->colormask & (PIPE_MASK_A | PIPE_MASK_G); if (rt->colormask & PIPE_MASK_R) colormask |= PIPE_MASK_B; @@ -147,7 +147,7 @@ etna_update_blend(struct etna_context *ctx) * - The color mask covers all channels of the render target * - No blending or logicop is used */ - const struct util_format_description *desc = util_format_description(pfb->cbufs[i]->format); + const struct util_format_description *desc = util_format_description(pfb->cbufs[i].format); bool full_overwrite = (blend->rt[i].fo_allowed && util_format_colormask_full(desc, colormask)); @@ -203,10 +203,10 @@ etna_update_blend_color(struct etna_context *ctx) unsigned rt = 0; for (unsigned i = 0; i < fb->nr_cbufs; i++) { - if (!fb->cbufs[i]) + if (!fb->cbufs[i].texture) continue; - bool rb_swap = translate_pe_format_rb_swap(fb->cbufs[i]->format); + bool rb_swap = translate_pe_format_rb_swap(fb->cbufs[i].format); if (rt == 0) { cs->PE_ALPHA_BLEND_COLOR = diff --git a/src/gallium/drivers/etnaviv/etnaviv_blt.c b/src/gallium/drivers/etnaviv/etnaviv_blt.c index f1854ab656a..a0f9f0f3298 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_blt.c +++ b/src/gallium/drivers/etnaviv/etnaviv_blt.c @@ -225,7 +225,7 @@ etna_blit_clear_color_blt(struct pipe_context *pctx, unsigned idx, const union pipe_color_union *color) { struct etna_context *ctx = etna_context(pctx); - struct pipe_surface *dst = ctx->framebuffer_s.cbufs[idx]; + struct pipe_surface *dst = ctx->fb_cbufs[idx]; struct etna_surface *surf = etna_surface(dst); uint64_t new_clear_value = etna_clear_blit_pack_rgba(surf->base.format, color); int msaa_xscale = 1, msaa_yscale = 1; @@ -385,7 +385,7 @@ etna_clear_blt(struct pipe_context *pctx, unsigned buffers, const struct pipe_sc if (buffers & PIPE_CLEAR_COLOR) { for (int idx = 0; idx < ctx->framebuffer_s.nr_cbufs; ++idx) { - struct etna_surface *surf = etna_surface(ctx->framebuffer_s.cbufs[idx]); + struct etna_surface *surf = etna_surface(ctx->fb_cbufs[idx]); if (!surf) continue; @@ -397,8 +397,8 @@ etna_clear_blt(struct pipe_context *pctx, unsigned buffers, const struct pipe_sc } } - if ((buffers & PIPE_CLEAR_DEPTHSTENCIL) && ctx->framebuffer_s.zsbuf != NULL) - etna_blit_clear_zs_blt(pctx, ctx->framebuffer_s.zsbuf, buffers, depth, stencil); + if ((buffers & PIPE_CLEAR_DEPTHSTENCIL) && ctx->framebuffer_s.zsbuf.texture != NULL) + etna_blit_clear_zs_blt(pctx, ctx->fb_zsbuf, buffers, depth, stencil); etna_stall(ctx->stream, SYNC_RECIPIENT_RA, SYNC_RECIPIENT_BLT); diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.c b/src/gallium/drivers/etnaviv/etnaviv_context.c index 99aa9c12a4c..3e2e93695c2 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_context.c +++ b/src/gallium/drivers/etnaviv/etnaviv_context.c @@ -114,6 +114,7 @@ etna_context_destroy(struct pipe_context *pctx) if (ctx->flush_resources) _mesa_set_destroy(ctx->flush_resources, NULL); + util_framebuffer_init(pctx, NULL, ctx->fb_cbufs, &ctx->fb_zsbuf); util_copy_framebuffer_state(&ctx->framebuffer_s, NULL); if (ctx->blitter) @@ -306,8 +307,8 @@ etna_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info, key.flatshade = ctx->rasterizer->flatshade; for (i = 0; i < pfb->nr_cbufs; i++) { - if (pfb->cbufs[i]) - key.frag_rb_swap |= !!translate_pe_format_rb_swap(pfb->cbufs[i]->format) << i; + if (pfb->cbufs[i].texture) + key.frag_rb_swap |= !!translate_pe_format_rb_swap(pfb->cbufs[i].format) << i; } if (!etna_get_vs(ctx, &key) || !etna_get_fs(ctx, &key)) { @@ -324,20 +325,20 @@ etna_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info, */ if (ctx->dirty & ETNA_DIRTY_ZSA) { if (etna_depth_enabled(ctx)) - resource_written(ctx, pfb->zsbuf->texture); + resource_written(ctx, pfb->zsbuf.texture); if (etna_stencil_enabled(ctx)) - resource_written(ctx, pfb->zsbuf->texture); + resource_written(ctx, pfb->zsbuf.texture); } if (ctx->dirty & ETNA_DIRTY_FRAMEBUFFER) { for (i = 0; i < pfb->nr_cbufs; i++) { struct pipe_resource *surf; - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; - surf = pfb->cbufs[i]->texture; + surf = pfb->cbufs[i].texture; resource_written(ctx, surf); } } @@ -443,12 +444,12 @@ etna_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info, pctx->flush(pctx, NULL, 0); for (i = 0; i < pfb->nr_cbufs; i++) { - if (pfb->cbufs[i]) - etna_resource_level_mark_changed(etna_surface(pfb->cbufs[i])->level); + if (ctx->fb_cbufs[i]) + etna_resource_level_mark_changed(etna_surface(ctx->fb_cbufs[i])->level); } - if (ctx->framebuffer_s.zsbuf) - etna_resource_level_mark_changed(etna_surface(ctx->framebuffer_s.zsbuf)->level); + if (ctx->fb_zsbuf) + etna_resource_level_mark_changed(etna_surface(ctx->fb_zsbuf)->level); if (info->index_size && indexbuf != info->index.resource) pipe_resource_reference(&indexbuf, NULL); } diff --git a/src/gallium/drivers/etnaviv/etnaviv_context.h b/src/gallium/drivers/etnaviv/etnaviv_context.h index d4bb21fa115..147ce90629e 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_context.h +++ b/src/gallium/drivers/etnaviv/etnaviv_context.h @@ -39,6 +39,7 @@ #include "pipe/p_shader_tokens.h" #include "pipe/p_state.h" #include "util/slab.h" +#include "util/u_framebuffer.h" #include struct pipe_screen; @@ -181,6 +182,8 @@ struct etna_context { struct etna_index_buffer index_buffer; struct etna_shader_state shader; + PIPE_FB_SURFACES; //STOP USING THIS + /* saved parameter-like state. these are mainly kept around for the blitter */ struct pipe_framebuffer_state framebuffer_s; struct pipe_stencil_ref stencil_ref_s; diff --git a/src/gallium/drivers/etnaviv/etnaviv_rs.c b/src/gallium/drivers/etnaviv/etnaviv_rs.c index 9af671eea9c..7b77b040a1e 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_rs.c +++ b/src/gallium/drivers/etnaviv/etnaviv_rs.c @@ -342,7 +342,7 @@ etna_blit_clear_color_rs(struct pipe_context *pctx, unsigned idx, const union pipe_color_union *color, bool use_ts) { struct etna_context *ctx = etna_context(pctx); - struct pipe_surface *dst = ctx->framebuffer_s.cbufs[idx]; + struct pipe_surface *dst = ctx->fb_cbufs[idx]; struct etna_surface *surf = etna_surface(dst); uint64_t new_clear_value = etna_clear_blit_pack_rgba(surf->base.format, color); @@ -484,7 +484,7 @@ etna_clear_rs(struct pipe_context *pctx, unsigned buffers, const struct pipe_sci bool need_ts_flush = false; if (buffers & PIPE_CLEAR_COLOR) { for (int idx = 0; idx < ctx->framebuffer_s.nr_cbufs; ++idx) { - struct etna_surface *surf = etna_surface(ctx->framebuffer_s.cbufs[idx]); + struct etna_surface *surf = etna_surface(ctx->fb_cbufs[idx]); if (!surf) continue; @@ -493,8 +493,8 @@ etna_clear_rs(struct pipe_context *pctx, unsigned buffers, const struct pipe_sci need_ts_flush = true; } } - if ((buffers & PIPE_CLEAR_DEPTHSTENCIL) && ctx->framebuffer_s.zsbuf != NULL) { - struct etna_surface *surf = etna_surface(ctx->framebuffer_s.zsbuf); + if ((buffers & PIPE_CLEAR_DEPTHSTENCIL) && ctx->fb_zsbuf != NULL) { + struct etna_surface *surf = etna_surface(ctx->fb_zsbuf); if (surf->level->ts_size) need_ts_flush = true; @@ -510,7 +510,7 @@ etna_clear_rs(struct pipe_context *pctx, unsigned buffers, const struct pipe_sci const bool use_ts = etna_use_ts_for_mrt(ctx->screen, &ctx->framebuffer_s); for (int idx = 0; idx < ctx->framebuffer_s.nr_cbufs; ++idx) { - struct etna_surface *surf = etna_surface(ctx->framebuffer_s.cbufs[idx]); + struct etna_surface *surf = etna_surface(ctx->fb_cbufs[idx]); if (!surf) continue; @@ -528,8 +528,8 @@ etna_clear_rs(struct pipe_context *pctx, unsigned buffers, const struct pipe_sci etna_set_state(ctx->stream, VIVS_GL_FLUSH_CACHE, VIVS_GL_FLUSH_CACHE_COLOR | VIVS_GL_FLUSH_CACHE_DEPTH); - if ((buffers & PIPE_CLEAR_DEPTHSTENCIL) && ctx->framebuffer_s.zsbuf != NULL) - etna_blit_clear_zs_rs(pctx, ctx->framebuffer_s.zsbuf, buffers, depth, stencil); + if ((buffers & PIPE_CLEAR_DEPTHSTENCIL) && ctx->fb_zsbuf != NULL) + etna_blit_clear_zs_rs(pctx, ctx->fb_zsbuf, buffers, depth, stencil); etna_stall(ctx->stream, SYNC_RECIPIENT_RA, SYNC_RECIPIENT_PE); } diff --git a/src/gallium/drivers/etnaviv/etnaviv_state.c b/src/gallium/drivers/etnaviv/etnaviv_state.c index 1f369316478..1a347b5cbed 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_state.c +++ b/src/gallium/drivers/etnaviv/etnaviv_state.c @@ -150,11 +150,13 @@ etna_set_framebuffer_state(struct pipe_context *pctx, const bool use_ts = etna_use_ts_for_mrt(screen, fb); unsigned rt = 0; + util_framebuffer_init(pctx, fb, ctx->fb_cbufs, &ctx->fb_zsbuf); + for (unsigned i = 0; i < fb->nr_cbufs; i++) { - if (!fb->cbufs[i]) + if (!fb->cbufs[i].texture) continue; - struct etna_surface *cbuf = etna_surface(fb->cbufs[i]); + struct etna_surface *cbuf = etna_surface(ctx->fb_cbufs[i]); struct etna_resource *res = etna_resource(cbuf->base.texture); bool color_supertiled = (res->layout & ETNA_LAYOUT_BIT_SUPER) != 0; uint32_t fmt = translate_pe_format(cbuf->base.format); @@ -336,8 +338,8 @@ etna_set_framebuffer_state(struct pipe_context *pctx, cs->PE_PIPE_COLOR_ADDR[i] = screen->dummy_rt_reloc; } - if (fb->zsbuf != NULL) { - struct etna_surface *zsbuf = etna_surface(fb->zsbuf); + if (fb->zsbuf.texture != NULL) { + struct etna_surface *zsbuf = etna_surface(ctx->fb_zsbuf); struct etna_resource *res = etna_resource(zsbuf->base.texture); etna_update_render_surface(pctx, zsbuf); @@ -761,7 +763,7 @@ etna_update_ts_config(struct etna_context *ctx) for (unsigned i = 0; i < fb->nr_cbufs; i++) { uint32_t ts_config; - if (!fb->cbufs[i]) + if (!fb->cbufs[i].texture) continue; /* Read the current ts config value for the render target. */ @@ -771,7 +773,7 @@ etna_update_ts_config(struct etna_context *ctx) ts_config = ctx->framebuffer.RT_TS_MEM_CONFIG[rt - 1]; /* Update the ts config for color fast clear. */ - struct etna_surface *c_surf = etna_surface(fb->cbufs[i]); + struct etna_surface *c_surf = etna_surface(ctx->fb_cbufs[i]); if (etna_resource_level_ts_valid(c_surf->level)) { if (rt == 0) ts_config |= VIVS_TS_MEM_CONFIG_COLOR_FAST_CLEAR; @@ -801,8 +803,8 @@ etna_update_ts_config(struct etna_context *ctx) } /* Update the ts config for depth fast clear. */ - if (ctx->framebuffer_s.zsbuf) { - struct etna_surface *zs_surf = etna_surface(ctx->framebuffer_s.zsbuf); + if (ctx->framebuffer_s.zsbuf.texture) { + struct etna_surface *zs_surf = etna_surface(ctx->fb_zsbuf); uint32_t ts_config = ctx->framebuffer.TS_MEM_CONFIG; if (etna_resource_level_ts_valid(zs_surf->level)) @@ -873,10 +875,10 @@ etna_update_zsa(struct etna_context *ctx) * know if any other draws to the same surface require late Z write. */ for (unsigned i = 0; i < fb->nr_cbufs; i++) { - if (!fb->cbufs[i]) + if (!fb->cbufs[i].texture) continue; - struct etna_surface *cbuf = etna_surface(fb->cbufs[i]); + struct etna_surface *cbuf = etna_surface(ctx->fb_cbufs[i]); struct etna_resource *res = etna_resource(cbuf->base.texture); if (res->layout == ETNA_LAYOUT_LINEAR) @@ -927,10 +929,10 @@ etna_update_zsa(struct etna_context *ctx) new_ra_depth |= VIVS_RA_EARLY_DEPTH_WRITE_DISABLE; for (unsigned i = 0; i < fb->nr_cbufs; i++) { - if (!fb->cbufs[i]) + if (!fb->cbufs[i].texture) continue; - struct pipe_resource *res = fb->cbufs[i]->texture; + struct pipe_resource *res = fb->cbufs[i].texture; if ((late_z_test || late_zs) && res->nr_samples > 1) new_ra_depth |= VIVS_RA_EARLY_DEPTH_LATE_DEPTH_MSAA; @@ -956,10 +958,10 @@ etna_record_flush_resources(struct etna_context *ctx) struct pipe_framebuffer_state *fb = &ctx->framebuffer_s; for (unsigned i = 0; i < fb->nr_cbufs; i++) { - if (!fb->cbufs[i]) + if (!fb->cbufs[i].texture) continue; - struct etna_surface *surf = etna_surface(fb->cbufs[i]); + struct etna_surface *surf = etna_surface(ctx->fb_cbufs[i]); struct etna_resource *rsc = etna_resource(surf->prsc); if (rsc->shared && !rsc->explicit_flush) diff --git a/src/gallium/drivers/etnaviv/etnaviv_state.h b/src/gallium/drivers/etnaviv/etnaviv_state.h index 1820df0de1b..5e95ff856a4 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_state.h +++ b/src/gallium/drivers/etnaviv/etnaviv_state.h @@ -53,7 +53,7 @@ etna_use_ts_for_mrt(const struct etna_screen *screen, const struct pipe_framebuf unsigned count = 0; for (unsigned i = 0; i < fb->nr_cbufs; i++) { - if (!fb->cbufs[i]) + if (!fb->cbufs[i].texture) continue; count++; diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_draw.c b/src/gallium/drivers/freedreno/a2xx/fd2_draw.c index 0b06cd4653b..7e3b8a7af8e 100644 --- a/src/gallium/drivers/freedreno/a2xx/fd2_draw.c +++ b/src/gallium/drivers/freedreno/a2xx/fd2_draw.c @@ -441,7 +441,7 @@ fd2_clear_fast(struct fd_context *ctx, unsigned buffers, struct fd_ringbuffer *ring = batch->draw; struct pipe_framebuffer_state *pfb = &batch->framebuffer; uint32_t color_clear = 0, depth_clear = 0; - enum pipe_format format = pipe_surface_format(pfb->cbufs[0]); + enum pipe_format format = pipe_surface_format(&pfb->cbufs[0]); int depth_size = -1; /* -1: no clear, 0: clear 16-bit, 1: clear 32-bit */ int color_size = -1; @@ -457,12 +457,12 @@ fd2_clear_fast(struct fd_context *ctx, unsigned buffers, if (!(buffers & PIPE_CLEAR_DEPTH)) return false; - if ((pfb->zsbuf->format == PIPE_FORMAT_Z24_UNORM_S8_UINT || - pfb->zsbuf->format == PIPE_FORMAT_S8_UINT_Z24_UNORM) && + if ((pfb->zsbuf.format == PIPE_FORMAT_Z24_UNORM_S8_UINT || + pfb->zsbuf.format == PIPE_FORMAT_S8_UINT_Z24_UNORM) && !(buffers & PIPE_CLEAR_STENCIL)) return false; - depth_size = fd_pipe2depth(pfb->zsbuf->format) == DEPTHX_24_8; + depth_size = fd_pipe2depth(pfb->zsbuf.format) == DEPTHX_24_8; } assert(color_size >= 0 || depth_size >= 0); @@ -583,7 +583,7 @@ fd2_clear(struct fd_context *ctx, enum fd_buffer_mask buffers, if (buffers & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL)) { uint32_t clear_mask, depth_clear; - switch (fd_pipe2depth(fb->zsbuf->format)) { + switch (fd_pipe2depth(fb->zsbuf.format)) { case DEPTHX_24_8: clear_mask = ((buffers & FD_BUFFER_DEPTH) ? 0xe : 0) | ((buffers & FD_BUFFER_STENCIL) ? 0x1 : 0); diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_gmem.c b/src/gallium/drivers/freedreno/a2xx/fd2_gmem.c index b0c63558ce9..09d7045a1a5 100644 --- a/src/gallium/drivers/freedreno/a2xx/fd2_gmem.c +++ b/src/gallium/drivers/freedreno/a2xx/fd2_gmem.c @@ -186,10 +186,10 @@ prepare_tile_fini_ib(struct fd_batch *batch) assert_dt OUT_RING(ring, A2XX_RB_MODECONTROL_EDRAM_MODE(EDRAM_COPY)); if (batch->resolve & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL)) - emit_gmem2mem_surf(batch, gmem->zsbuf_base[0], pfb->zsbuf); + emit_gmem2mem_surf(batch, gmem->zsbuf_base[0], &pfb->zsbuf); if (batch->resolve & FD_BUFFER_COLOR) - emit_gmem2mem_surf(batch, gmem->cbuf_base[0], pfb->cbufs[0]); + emit_gmem2mem_surf(batch, gmem->cbuf_base[0], &pfb->cbufs[0]); OUT_PKT3(ring, CP_SET_CONSTANT, 2); OUT_RING(ring, CP_REG(REG_A2XX_RB_MODECONTROL)); @@ -359,10 +359,10 @@ fd2_emit_tile_mem2gmem(struct fd_batch *batch, OUT_RING(ring, 0x00000000); if (fd_gmem_needs_restore(batch, tile, FD_BUFFER_DEPTH | FD_BUFFER_STENCIL)) - emit_mem2gmem_surf(batch, gmem->zsbuf_base[0], pfb->zsbuf); + emit_mem2gmem_surf(batch, gmem->zsbuf_base[0], &pfb->zsbuf); if (fd_gmem_needs_restore(batch, tile, FD_BUFFER_COLOR)) - emit_mem2gmem_surf(batch, gmem->cbuf_base[0], pfb->cbufs[0]); + emit_mem2gmem_surf(batch, gmem->cbuf_base[0], &pfb->cbufs[0]); OUT_PKT3(ring, CP_SET_CONSTANT, 2); OUT_RING(ring, CP_REG(REG_A2XX_PA_CL_VTE_CNTL)); @@ -419,9 +419,9 @@ fd2_emit_sysmem_prep(struct fd_batch *batch) struct fd_context *ctx = batch->ctx; struct fd_ringbuffer *ring = batch->gmem; struct pipe_framebuffer_state *pfb = &batch->framebuffer; - struct pipe_surface *psurf = pfb->cbufs[0]; + struct pipe_surface *psurf = &pfb->cbufs[0]; - if (!psurf) + if (!psurf->texture) return; struct fd_resource *rsc = fd_resource(psurf->texture); @@ -470,7 +470,7 @@ fd2_emit_tile_init(struct fd_batch *batch) assert_dt struct fd_ringbuffer *ring = batch->gmem; struct pipe_framebuffer_state *pfb = &batch->framebuffer; const struct fd_gmem_stateobj *gmem = batch->gmem_state; - enum pipe_format format = pipe_surface_format(pfb->cbufs[0]); + enum pipe_format format = pipe_surface_format(&pfb->cbufs[0]); uint32_t reg; fd2_emit_restore(ctx, ring); @@ -483,19 +483,19 @@ fd2_emit_tile_init(struct fd_batch *batch) assert_dt OUT_RING(ring, A2XX_RB_COLOR_INFO_SWAP(fmt2swap(format)) | A2XX_RB_COLOR_INFO_FORMAT(fd2_pipe2color(format))); reg = A2XX_RB_DEPTH_INFO_DEPTH_BASE(gmem->zsbuf_base[0]); - if (pfb->zsbuf) - reg |= A2XX_RB_DEPTH_INFO_DEPTH_FORMAT(fd_pipe2depth(pfb->zsbuf->format)); + if (pfb->zsbuf.texture) + reg |= A2XX_RB_DEPTH_INFO_DEPTH_FORMAT(fd_pipe2depth(pfb->zsbuf.format)); OUT_RING(ring, reg); /* RB_DEPTH_INFO */ /* fast clear patches */ int depth_size = -1; int color_size = -1; - if (pfb->cbufs[0]) + if (pfb->cbufs[0].texture) color_size = util_format_get_blocksizebits(format) == 32 ? 4 : 2; - if (pfb->zsbuf) - depth_size = fd_pipe2depth(pfb->zsbuf->format) == 1 ? 4 : 2; + if (pfb->zsbuf.texture) + depth_size = fd_pipe2depth(pfb->zsbuf.format) == 1 ? 4 : 2; for (int i = 0; i < fd_patch_num_elements(&batch->gmem_patches); i++) { struct fd_cs_patch *patch = fd_patch_element(&batch->gmem_patches, i); @@ -524,9 +524,9 @@ fd2_emit_tile_init(struct fd_batch *batch) assert_dt patch->cs[1] = A2XX_RB_COLOR_INFO_SWAP(fmt2swap(format)) | A2XX_RB_COLOR_INFO_FORMAT(fd2_pipe2color(format)); patch->cs[2] = A2XX_RB_DEPTH_INFO_DEPTH_BASE(gmem->zsbuf_base[0]); - if (pfb->zsbuf) + if (pfb->zsbuf.texture) patch->cs[2] |= A2XX_RB_DEPTH_INFO_DEPTH_FORMAT( - fd_pipe2depth(pfb->zsbuf->format)); + fd_pipe2depth(pfb->zsbuf.format)); continue; default: continue; @@ -653,7 +653,7 @@ fd2_emit_tile_prep(struct fd_batch *batch, const struct fd_tile *tile) { struct fd_ringbuffer *ring = batch->gmem; struct pipe_framebuffer_state *pfb = &batch->framebuffer; - enum pipe_format format = pipe_surface_format(pfb->cbufs[0]); + enum pipe_format format = pipe_surface_format(&pfb->cbufs[0]); OUT_PKT3(ring, CP_SET_CONSTANT, 2); OUT_RING(ring, CP_REG(REG_A2XX_RB_COLOR_INFO)); @@ -678,7 +678,7 @@ fd2_emit_tile_renderprep(struct fd_batch *batch, struct fd2_context *fd2_ctx = fd2_context(ctx); struct fd_ringbuffer *ring = batch->gmem; struct pipe_framebuffer_state *pfb = &batch->framebuffer; - enum pipe_format format = pipe_surface_format(pfb->cbufs[0]); + enum pipe_format format = pipe_surface_format(&pfb->cbufs[0]); OUT_PKT3(ring, CP_SET_CONSTANT, 2); OUT_RING(ring, CP_REG(REG_A2XX_RB_COLOR_INFO)); diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c index cd733e8965b..ed55ce6731f 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c @@ -257,7 +257,7 @@ emit_textures(struct fd_context *ctx, struct fd_ringbuffer *ring, */ void fd3_emit_gmem_restore_tex(struct fd_ringbuffer *ring, - struct pipe_surface **psurf, int bufs) + struct pipe_surface *psurf, int bufs) { int i, j; @@ -287,7 +287,7 @@ fd3_emit_gmem_restore_tex(struct fd_ringbuffer *ring, OUT_RING(ring, CP_LOAD_STATE_1_STATE_TYPE(ST_CONSTANTS) | CP_LOAD_STATE_1_EXT_SRC_ADDR(0)); for (i = 0; i < bufs; i++) { - if (!psurf[i]) { + if (!psurf[i].texture) { OUT_RING(ring, A3XX_TEX_CONST_0_TYPE(A3XX_TEX_2D) | A3XX_TEX_CONST_0_SWIZ_X(A3XX_TEX_ONE) | A3XX_TEX_CONST_0_SWIZ_Y(A3XX_TEX_ONE) | @@ -299,10 +299,10 @@ fd3_emit_gmem_restore_tex(struct fd_ringbuffer *ring, continue; } - struct fd_resource *rsc = fd_resource(psurf[i]->texture); - enum pipe_format format = fd_gmem_restore_format(psurf[i]->format); + struct fd_resource *rsc = fd_resource(psurf[i].texture); + enum pipe_format format = fd_gmem_restore_format(psurf[i].format); uint16_t width, height; - pipe_surface_size(psurf[i], &width, &height); + pipe_surface_size(&psurf[i], &width, &height); /* The restore blit_zs shader expects stencil in sampler 0, and depth * in sampler 1 */ @@ -312,9 +312,9 @@ fd3_emit_gmem_restore_tex(struct fd_ringbuffer *ring, } /* note: PIPE_BUFFER disallowed for surfaces */ - unsigned lvl = psurf[i]->u.tex.level; + unsigned lvl = psurf[i].u.tex.level; - assert(psurf[i]->u.tex.first_layer == psurf[i]->u.tex.last_layer); + assert(psurf[i].u.tex.first_layer == psurf[i].u.tex.last_layer); OUT_RING(ring, A3XX_TEX_CONST_0_TILE_MODE(rsc->layout.tile_mode) | A3XX_TEX_CONST_0_FMT(fd3_pipe2tex(format)) | @@ -337,14 +337,14 @@ fd3_emit_gmem_restore_tex(struct fd_ringbuffer *ring, OUT_RING(ring, CP_LOAD_STATE_1_STATE_TYPE(ST_CONSTANTS) | CP_LOAD_STATE_1_EXT_SRC_ADDR(0)); for (i = 0; i < bufs; i++) { - if (psurf[i]) { - struct fd_resource *rsc = fd_resource(psurf[i]->texture); + if (psurf[i].texture) { + struct fd_resource *rsc = fd_resource(psurf[i].texture); /* Matches above logic for blit_zs shader */ if (rsc->stencil && i == 0) rsc = rsc->stencil; - unsigned lvl = psurf[i]->u.tex.level; + unsigned lvl = psurf[i].u.tex.level; uint32_t offset = - fd_resource_offset(rsc, lvl, psurf[i]->u.tex.first_layer); + fd_resource_offset(rsc, lvl, psurf[i].u.tex.first_layer); OUT_RELOC(ring, rsc->bo, offset, 0, 0); } else { OUT_RING(ring, 0x00000000); @@ -702,9 +702,9 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring, (FD_DIRTY_VIEWPORT | FD_DIRTY_RASTERIZER | FD_DIRTY_FRAMEBUFFER)) { float zmin, zmax; int depth = 24; - if (ctx->batch->framebuffer.zsbuf) { + if (ctx->batch->framebuffer.zsbuf.texture) { depth = util_format_get_component_bits( - pipe_surface_format(ctx->batch->framebuffer.zsbuf), + pipe_surface_format(&ctx->batch->framebuffer.zsbuf), UTIL_FORMAT_COLORSPACE_ZS, 0); } util_viewport_zmin_zmax(&ctx->viewport[0], ctx->rasterizer->clip_halfz, @@ -749,7 +749,7 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring, for (i = 0; i < ARRAY_SIZE(blend->rb_mrt); i++) { enum pipe_format format = - pipe_surface_format(ctx->batch->framebuffer.cbufs[i]); + pipe_surface_format(&ctx->batch->framebuffer.cbufs[i]); const struct util_format_description *desc = util_format_description(format); bool is_float = util_format_is_float(format); diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_emit.h b/src/gallium/drivers/freedreno/a3xx/fd3_emit.h index 011b51e1330..96e47653148 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_emit.h +++ b/src/gallium/drivers/freedreno/a3xx/fd3_emit.h @@ -21,7 +21,7 @@ struct fd_ringbuffer; void fd3_emit_gmem_restore_tex(struct fd_ringbuffer *ring, - struct pipe_surface **psurf, int bufs); + struct pipe_surface *psurf, int bufs); /* grouped together emit-state for prog/vertex/state emit: */ struct fd3_emit { diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c index 4ff0c537c56..e759d33fcea 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c @@ -39,7 +39,7 @@ fd3_gmem_emit_set_prog(struct fd_context *ctx, struct fd3_emit *emit, static void emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs, - struct pipe_surface **bufs, const uint32_t *bases, uint32_t bin_w, + struct pipe_surface *bufs, const uint32_t *bases, uint32_t bin_w, bool decode_srgb) { enum a3xx_tile_mode tile_mode; @@ -61,8 +61,8 @@ emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs, tile_mode = LINEAR; } - if ((i < nr_bufs) && bufs[i]) { - struct pipe_surface *psurf = bufs[i]; + if ((i < nr_bufs) && bufs[i].texture) { + struct pipe_surface *psurf = &bufs[i]; rsc = fd_resource(psurf->texture); pformat = psurf->format; @@ -107,14 +107,14 @@ emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs, A3XX_RB_MRT_BUF_INFO_COLOR_BUF_PITCH(stride) | A3XX_RB_MRT_BUF_INFO_COLOR_SWAP(swap) | COND(srgb, A3XX_RB_MRT_BUF_INFO_COLOR_SRGB)); - if (bin_w || (i >= nr_bufs) || !bufs[i]) { + if (bin_w || (i >= nr_bufs) || !bufs[i].texture) { OUT_RING(ring, A3XX_RB_MRT_BUF_BASE_COLOR_BUF_BASE(base)); } else { OUT_RELOC(ring, rsc->bo, offset, 0, -1); } OUT_PKT0(ring, REG_A3XX_SP_FS_IMAGE_OUTPUT_REG(i), 1); - OUT_RING(ring, COND((i < nr_bufs) && bufs[i], + OUT_RING(ring, COND((i < nr_bufs) && bufs[i].texture, A3XX_SP_FS_IMAGE_OUTPUT_REG_MRTFORMAT( fd3_fs_output_format(pformat)))); } @@ -449,23 +449,23 @@ fd3_emit_tile_gmem2mem(struct fd_batch *batch, fd3_emit_vertex_bufs(ring, &emit); if (batch->resolve & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL)) { - struct fd_resource *rsc = fd_resource(pfb->zsbuf->texture); + struct fd_resource *rsc = fd_resource(pfb->zsbuf.texture); if (!rsc->stencil || batch->resolve & FD_BUFFER_DEPTH) emit_gmem2mem_surf(batch, RB_COPY_DEPTH_STENCIL, false, - gmem->zsbuf_base[0], pfb->zsbuf); + gmem->zsbuf_base[0], &pfb->zsbuf); if (rsc->stencil && batch->resolve & FD_BUFFER_STENCIL) emit_gmem2mem_surf(batch, RB_COPY_DEPTH_STENCIL, true, - gmem->zsbuf_base[1], pfb->zsbuf); + gmem->zsbuf_base[1], &pfb->zsbuf); } if (batch->resolve & FD_BUFFER_COLOR) { for (i = 0; i < pfb->nr_cbufs; i++) { - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; if (!(batch->resolve & (PIPE_CLEAR_COLOR0 << i))) continue; emit_gmem2mem_surf(batch, RB_COPY_RESOLVE, false, gmem->cbuf_base[i], - pfb->cbufs[i]); + &pfb->cbufs[i]); } } @@ -484,10 +484,10 @@ fd3_emit_tile_gmem2mem(struct fd_batch *batch, static void emit_mem2gmem_surf(struct fd_batch *batch, const uint32_t bases[], - struct pipe_surface **psurf, uint32_t bufs, uint32_t bin_w) + struct pipe_surface *psurf, uint32_t bufs, uint32_t bin_w) { struct fd_ringbuffer *ring = batch->gmem; - struct pipe_surface *zsbufs[2]; + struct pipe_surface zsbufs[2]; assert(bufs > 0); @@ -498,8 +498,8 @@ emit_mem2gmem_surf(struct fd_batch *batch, const uint32_t bases[], emit_mrt(ring, bufs, psurf, bases, bin_w, false); - if (psurf[0] && (psurf[0]->format == PIPE_FORMAT_Z32_FLOAT || - psurf[0]->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT)) { + if (psurf[0].texture && (psurf[0].format == PIPE_FORMAT_Z32_FLOAT || + psurf[0].format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT)) { /* Depth is stored as unorm in gmem, so we have to write it in using a * special blit shader which writes depth. */ @@ -515,7 +515,7 @@ emit_mem2gmem_surf(struct fd_batch *batch, const uint32_t bases[], A3XX_RB_DEPTH_INFO_DEPTH_FORMAT(DEPTHX_32)); OUT_RING(ring, A3XX_RB_DEPTH_PITCH(4 * batch->gmem_state->bin_w)); - if (psurf[0]->format == PIPE_FORMAT_Z32_FLOAT) { + if (psurf[0].format == PIPE_FORMAT_Z32_FLOAT) { OUT_PKT0(ring, REG_A3XX_RB_MRT_CONTROL(0), 1); OUT_RING(ring, 0); } else { @@ -677,15 +677,15 @@ fd3_emit_tile_mem2gmem(struct fd_batch *batch, if (fd_gmem_needs_restore(batch, tile, FD_BUFFER_DEPTH | FD_BUFFER_STENCIL)) { - if (pfb->zsbuf->format != PIPE_FORMAT_Z32_FLOAT_S8X24_UINT && - pfb->zsbuf->format != PIPE_FORMAT_Z32_FLOAT) { + if (pfb->zsbuf.format != PIPE_FORMAT_Z32_FLOAT_S8X24_UINT && + pfb->zsbuf.format != PIPE_FORMAT_Z32_FLOAT) { /* Non-float can use a regular color write. It's split over 8-bit * components, so half precision is always sufficient. */ fd3_gmem_emit_set_prog(ctx, &emit, &ctx->blit_prog[0]); } else { /* Float depth needs special blit shader that writes depth */ - if (pfb->zsbuf->format == PIPE_FORMAT_Z32_FLOAT) + if (pfb->zsbuf.format == PIPE_FORMAT_Z32_FLOAT) fd3_gmem_emit_set_prog(ctx, &emit, &ctx->blit_z); else fd3_gmem_emit_set_prog(ctx, &emit, &ctx->blit_zs); @@ -736,8 +736,8 @@ fd3_emit_sysmem_prep(struct fd_batch *batch) assert_dt uint32_t i, pitch = 0; for (i = 0; i < pfb->nr_cbufs; i++) { - struct pipe_surface *psurf = pfb->cbufs[i]; - if (!psurf) + struct pipe_surface *psurf = &pfb->cbufs[i]; + if (!psurf->texture) continue; struct fd_resource *rsc = fd_resource(psurf->texture); pitch = fd_resource_pitch(rsc, psurf->u.tex.level) / rsc->layout.cpp; @@ -1002,12 +1002,12 @@ fd3_emit_tile_renderprep(struct fd_batch *batch, OUT_PKT0(ring, REG_A3XX_RB_DEPTH_INFO, 2); reg = A3XX_RB_DEPTH_INFO_DEPTH_BASE(gmem->zsbuf_base[0]); - if (pfb->zsbuf) { - reg |= A3XX_RB_DEPTH_INFO_DEPTH_FORMAT(fd_pipe2depth(pfb->zsbuf->format)); + if (pfb->zsbuf.texture) { + reg |= A3XX_RB_DEPTH_INFO_DEPTH_FORMAT(fd_pipe2depth(pfb->zsbuf.format)); } OUT_RING(ring, reg); - if (pfb->zsbuf) { - struct fd_resource *rsc = fd_resource(pfb->zsbuf->texture); + if (pfb->zsbuf.texture) { + struct fd_resource *rsc = fd_resource(pfb->zsbuf.texture); OUT_RING(ring, A3XX_RB_DEPTH_PITCH(gmem->bin_w << fdl_cpp_shift(&rsc->layout))); if (rsc->stencil) { diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_program.c b/src/gallium/drivers/freedreno/a3xx/fd3_program.c index 7471bd3a8d1..1dde7b7d33b 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_program.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_program.c @@ -74,7 +74,7 @@ emit_shader(struct fd_ringbuffer *ring, const struct ir3_shader_variant *so) void fd3_program_emit(struct fd_ringbuffer *ring, struct fd3_emit *emit, int nr, - struct pipe_surface **bufs) + struct pipe_surface *bufs) { const struct ir3_shader_variant *vp, *fp; const struct ir3_info *vsi, *fsi; @@ -167,7 +167,7 @@ fd3_program_emit(struct fd_ringbuffer *ring, struct fd3_emit *emit, int nr, * format, so it's just treated like red */ for (i = 0; i < nr; i++) - if (util_format_is_alpha(pipe_surface_format(bufs[i]))) + if (util_format_is_alpha(pipe_surface_format(&bufs[i]))) color_regid[i] += 3; /* we could probably divide this up into things that need to be @@ -319,7 +319,7 @@ fd3_program_emit(struct fd_ringbuffer *ring, struct fd3_emit *emit, int nr, COND(color_regid[i] & HALF_REG_ID, A3XX_SP_FS_MRT_REG_HALF_PRECISION); if (i < nr) { - enum pipe_format fmt = pipe_surface_format(bufs[i]); + enum pipe_format fmt = pipe_surface_format(&bufs[i]); mrt_reg |= COND(util_format_is_pure_uint(fmt), A3XX_SP_FS_MRT_REG_UINT) | COND(util_format_is_pure_sint(fmt), A3XX_SP_FS_MRT_REG_SINT); diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_program.h b/src/gallium/drivers/freedreno/a3xx/fd3_program.h index e41d2e005e0..8a072df8022 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_program.h +++ b/src/gallium/drivers/freedreno/a3xx/fd3_program.h @@ -31,7 +31,7 @@ fd3_program_state(struct ir3_program_state *state) } void fd3_program_emit(struct fd_ringbuffer *ring, struct fd3_emit *emit, int nr, - struct pipe_surface **bufs); + struct pipe_surface *bufs); void fd3_prog_init(struct pipe_context *pctx); diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_emit.c b/src/gallium/drivers/freedreno/a4xx/fd4_emit.c index 30ce9f98655..84e79959e93 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_emit.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_emit.c @@ -347,7 +347,7 @@ emit_textures(struct fd_context *ctx, struct fd_ringbuffer *ring, */ void fd4_emit_gmem_restore_tex(struct fd_ringbuffer *ring, unsigned nr_bufs, - struct pipe_surface **bufs) + struct pipe_surface *bufs) { unsigned char mrt_comp[A4XX_MAX_RENDER_TARGETS]; int i; @@ -382,11 +382,11 @@ fd4_emit_gmem_restore_tex(struct fd_ringbuffer *ring, unsigned nr_bufs, OUT_RING(ring, CP_LOAD_STATE4_1_STATE_TYPE(ST4_CONSTANTS) | CP_LOAD_STATE4_1_EXT_SRC_ADDR(0)); for (i = 0; i < nr_bufs; i++) { - if (bufs[i]) { - struct fd_resource *rsc = fd_resource(bufs[i]->texture); - enum pipe_format format = fd_gmem_restore_format(bufs[i]->format); + if (bufs[i].texture) { + struct fd_resource *rsc = fd_resource(bufs[i].texture); + enum pipe_format format = fd_gmem_restore_format(bufs[i].format); uint16_t width, height; - pipe_surface_size(bufs[i], &width, &height); + pipe_surface_size(&bufs[i], &width, &height); /* The restore blit_zs shader expects stencil in sampler 0, * and depth in sampler 1 */ @@ -396,9 +396,9 @@ fd4_emit_gmem_restore_tex(struct fd_ringbuffer *ring, unsigned nr_bufs, } /* note: PIPE_BUFFER disallowed for surfaces */ - unsigned lvl = bufs[i]->u.tex.level; + unsigned lvl = bufs[i].u.tex.level; unsigned offset = - fd_resource_offset(rsc, lvl, bufs[i]->u.tex.first_layer); + fd_resource_offset(rsc, lvl, bufs[i].u.tex.first_layer); /* z32 restore is accomplished using depth write. If there is * no stencil component (ie. PIPE_FORMAT_Z32_FLOAT_S8X24_UINT) @@ -411,7 +411,7 @@ fd4_emit_gmem_restore_tex(struct fd_ringbuffer *ring, unsigned nr_bufs, (format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT)) mrt_comp[i] = 0; - assert(bufs[i]->u.tex.first_layer == bufs[i]->u.tex.last_layer); + assert(bufs[i].u.tex.first_layer == bufs[i].u.tex.last_layer); OUT_RING(ring, A4XX_TEX_CONST_0_FMT(fd4_pipe2tex(format)) | A4XX_TEX_CONST_0_TYPE(A4XX_TEX_2D) | @@ -649,7 +649,7 @@ fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring, unsigned char mrt_comp[A4XX_MAX_RENDER_TARGETS] = {0}; for (unsigned i = 0; i < A4XX_MAX_RENDER_TARGETS; i++) { - mrt_comp[i] = ((i < pfb->nr_cbufs) && pfb->cbufs[i]) ? 0xf : 0; + mrt_comp[i] = ((i < pfb->nr_cbufs) && pfb->cbufs[i].texture) ? 0xf : 0; } OUT_PKT0(ring, REG_A4XX_RB_RENDER_COMPONENTS, 1); @@ -668,7 +668,7 @@ fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring, struct pipe_framebuffer_state *pfb = &ctx->batch->framebuffer; uint32_t rb_alpha_control = zsa->rb_alpha_control; - if (util_format_is_pure_integer(pipe_surface_format(pfb->cbufs[0]))) + if (util_format_is_pure_integer(pipe_surface_format(&pfb->cbufs[0]))) rb_alpha_control &= ~A4XX_RB_ALPHA_CONTROL_ALPHA_TEST; OUT_PKT0(ring, REG_A4XX_RB_ALPHA_CONTROL, 1); @@ -800,9 +800,9 @@ fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring, (FD_DIRTY_VIEWPORT | FD_DIRTY_RASTERIZER | FD_DIRTY_FRAMEBUFFER)) { float zmin, zmax; int depth = 24; - if (ctx->batch->framebuffer.zsbuf) { + if (ctx->batch->framebuffer.zsbuf.texture) { depth = util_format_get_component_bits( - pipe_surface_format(ctx->batch->framebuffer.zsbuf), + pipe_surface_format(&ctx->batch->framebuffer.zsbuf), UTIL_FORMAT_COLORSPACE_ZS, 0); } util_viewport_zmin_zmax(&ctx->viewport[0], ctx->rasterizer->clip_halfz, @@ -825,7 +825,7 @@ fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring, struct pipe_framebuffer_state *pfb = &ctx->batch->framebuffer; unsigned n = pfb->nr_cbufs; /* if we have depth/stencil, we need at least on MRT: */ - if (pfb->zsbuf) + if (pfb->zsbuf.texture) n = MAX2(1, n); fd4_program_emit(ring, emit, n, pfb->cbufs); } @@ -842,7 +842,7 @@ fd4_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring, for (i = 0; i < A4XX_MAX_RENDER_TARGETS; i++) { enum pipe_format format = - pipe_surface_format(ctx->batch->framebuffer.cbufs[i]); + pipe_surface_format(&ctx->batch->framebuffer.cbufs[i]); bool is_int = util_format_is_pure_integer(format); bool has_alpha = util_format_has_alpha(format); uint32_t control = blend->rb_mrt[i].control; diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_emit.h b/src/gallium/drivers/freedreno/a4xx/fd4_emit.h index 8f2a1094b8b..fa259fd6cc2 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_emit.h +++ b/src/gallium/drivers/freedreno/a4xx/fd4_emit.h @@ -19,7 +19,7 @@ struct fd_ringbuffer; void fd4_emit_gmem_restore_tex(struct fd_ringbuffer *ring, unsigned nr_bufs, - struct pipe_surface **bufs); + struct pipe_surface *bufs); /* grouped together emit-state for prog/vertex/state emit: */ struct fd4_emit { @@ -48,7 +48,7 @@ struct fd4_emit { static inline enum a4xx_color_fmt fd4_emit_format(struct pipe_surface *surf) { - if (!surf) + if (!surf->texture) return 0; return fd4_pipe2color(surf->format); } diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c b/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c index 6d510fd21b7..cbec5dfbf0f 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c @@ -40,7 +40,7 @@ fd4_gmem_emit_set_prog(struct fd_context *ctx, struct fd4_emit *emit, static void emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs, - struct pipe_surface **bufs, const uint32_t *bases, uint32_t bin_w, + struct pipe_surface *bufs, const uint32_t *bases, uint32_t bin_w, bool decode_srgb) { enum a4xx_tile_mode tile_mode; @@ -61,8 +61,8 @@ emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs, uint32_t base = 0; uint32_t offset = 0; - if ((i < nr_bufs) && bufs[i]) { - struct pipe_surface *psurf = bufs[i]; + if ((i < nr_bufs) && bufs[i].texture) { + struct pipe_surface *psurf = &bufs[i]; enum pipe_format pformat = psurf->format; rsc = fd_resource(psurf->texture); @@ -109,7 +109,7 @@ emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs, A4XX_RB_MRT_BUF_INFO_COLOR_BUF_PITCH(stride) | A4XX_RB_MRT_BUF_INFO_COLOR_SWAP(swap) | COND(srgb, A4XX_RB_MRT_BUF_INFO_COLOR_SRGB)); - if (bin_w || (i >= nr_bufs) || !bufs[i]) { + if (bin_w || (i >= nr_bufs) || !bufs[i].texture) { OUT_RING(ring, base); OUT_RING(ring, A4XX_RB_MRT_CONTROL3_STRIDE(stride)); } else { @@ -268,21 +268,21 @@ fd4_emit_tile_gmem2mem(struct fd_batch *batch, fd4_emit_vertex_bufs(ring, &emit); if (batch->resolve & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL)) { - struct fd_resource *rsc = fd_resource(pfb->zsbuf->texture); + struct fd_resource *rsc = fd_resource(pfb->zsbuf.texture); if (!rsc->stencil || (batch->resolve & FD_BUFFER_DEPTH)) - emit_gmem2mem_surf(batch, false, gmem->zsbuf_base[0], pfb->zsbuf); + emit_gmem2mem_surf(batch, false, gmem->zsbuf_base[0], &pfb->zsbuf); if (rsc->stencil && (batch->resolve & FD_BUFFER_STENCIL)) - emit_gmem2mem_surf(batch, true, gmem->zsbuf_base[1], pfb->zsbuf); + emit_gmem2mem_surf(batch, true, gmem->zsbuf_base[1], &pfb->zsbuf); } if (batch->resolve & FD_BUFFER_COLOR) { unsigned i; for (i = 0; i < pfb->nr_cbufs; i++) { - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; if (!(batch->resolve & (PIPE_CLEAR_COLOR0 << i))) continue; - emit_gmem2mem_surf(batch, false, gmem->cbuf_base[i], pfb->cbufs[i]); + emit_gmem2mem_surf(batch, false, gmem->cbuf_base[i], &pfb->cbufs[i]); } } @@ -297,14 +297,14 @@ fd4_emit_tile_gmem2mem(struct fd_batch *batch, static void emit_mem2gmem_surf(struct fd_batch *batch, const uint32_t *bases, - struct pipe_surface **bufs, uint32_t nr_bufs, uint32_t bin_w) + struct pipe_surface *bufs, uint32_t nr_bufs, uint32_t bin_w) { struct fd_ringbuffer *ring = batch->gmem; - struct pipe_surface *zsbufs[2]; + struct pipe_surface zsbufs[2]; emit_mrt(ring, nr_bufs, bufs, bases, bin_w, false); - if (bufs[0] && (bufs[0]->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT)) { + if (bufs[0].texture && (bufs[0].format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT)) { /* The gmem_restore_tex logic will put the first buffer's stencil * as color. Supply it with the proper information to make that * happen. @@ -357,7 +357,7 @@ fd4_emit_tile_mem2gmem(struct fd_batch *batch, OUT_RING(ring, fui(y1)); for (i = 0; i < A4XX_MAX_RENDER_TARGETS; i++) { - mrt_comp[i] = ((i < pfb->nr_cbufs) && pfb->cbufs[i]) ? 0xf : 0; + mrt_comp[i] = ((i < pfb->nr_cbufs) && pfb->cbufs[i].texture) ? 0xf : 0; OUT_PKT0(ring, REG_A4XX_RB_MRT_CONTROL(i), 1); OUT_RING(ring, A4XX_RB_MRT_CONTROL_ROP_CODE(ROP_COPY) | @@ -463,10 +463,10 @@ fd4_emit_tile_mem2gmem(struct fd_batch *batch, if (fd_gmem_needs_restore(batch, tile, FD_BUFFER_DEPTH | FD_BUFFER_STENCIL)) { - switch (pfb->zsbuf->format) { + switch (pfb->zsbuf.format) { case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT: case PIPE_FORMAT_Z32_FLOAT: - if (pfb->zsbuf->format == PIPE_FORMAT_Z32_FLOAT) + if (pfb->zsbuf.format == PIPE_FORMAT_Z32_FLOAT) fd4_gmem_emit_set_prog(ctx, &emit, &ctx->blit_z); else fd4_gmem_emit_set_prog(ctx, &emit, &ctx->blit_zs); @@ -705,14 +705,14 @@ fd4_emit_tile_prep(struct fd_batch *batch, const struct fd_tile *tile) struct pipe_framebuffer_state *pfb = &batch->framebuffer; const struct fd_gmem_stateobj *gmem = batch->gmem_state; - if (pfb->zsbuf) { - struct fd_resource *rsc = fd_resource(pfb->zsbuf->texture); + if (pfb->zsbuf.texture) { + struct fd_resource *rsc = fd_resource(pfb->zsbuf.texture); uint32_t cpp = rsc->layout.cpp; OUT_PKT0(ring, REG_A4XX_RB_DEPTH_INFO, 3); OUT_RING(ring, A4XX_RB_DEPTH_INFO_DEPTH_BASE(gmem->zsbuf_base[0]) | A4XX_RB_DEPTH_INFO_DEPTH_FORMAT( - fd4_pipe2depth(pfb->zsbuf->format))); + fd4_pipe2depth(pfb->zsbuf.format))); OUT_RING(ring, A4XX_RB_DEPTH_PITCH(cpp * gmem->bin_w)); OUT_RING(ring, A4XX_RB_DEPTH_PITCH2(cpp * gmem->bin_w)); @@ -739,9 +739,9 @@ fd4_emit_tile_prep(struct fd_batch *batch, const struct fd_tile *tile) } OUT_PKT0(ring, REG_A4XX_GRAS_DEPTH_CONTROL, 1); - if (pfb->zsbuf) { + if (pfb->zsbuf.texture) { OUT_RING(ring, A4XX_GRAS_DEPTH_CONTROL_FORMAT( - fd4_pipe2depth(pfb->zsbuf->format))); + fd4_pipe2depth(pfb->zsbuf.format))); } else { OUT_RING(ring, A4XX_GRAS_DEPTH_CONTROL_FORMAT(DEPTH4_NONE)); } diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_program.c b/src/gallium/drivers/freedreno/a4xx/fd4_program.c index 9d27af33336..4f96eecf995 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_program.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_program.c @@ -134,7 +134,7 @@ setup_stages(struct fd4_emit *emit, struct stage *s) void fd4_program_emit(struct fd_ringbuffer *ring, struct fd4_emit *emit, int nr, - struct pipe_surface **bufs) + struct pipe_surface *bufs) { struct stage s[MAX_STAGES]; uint32_t pos_regid, posz_regid, psize_regid, color_regid[8]; @@ -435,12 +435,12 @@ fd4_program_emit(struct fd_ringbuffer *ring, struct fd4_emit *emit, int nr, bool uint = false; bool sint = false; if (i < nr) { - format = fd4_emit_format(bufs[i]); - if (bufs[i]) { + format = fd4_emit_format(&bufs[i]); + if (bufs[i].texture) { if (!emit->no_decode_srgb) - srgb = util_format_is_srgb(bufs[i]->format); - uint = util_format_is_pure_uint(bufs[i]->format); - sint = util_format_is_pure_sint(bufs[i]->format); + srgb = util_format_is_srgb(bufs[i].format); + uint = util_format_is_pure_uint(bufs[i].format); + sint = util_format_is_pure_sint(bufs[i].format); } } OUT_RING(ring, A4XX_SP_FS_MRT_REG_REGID(color_regid[i]) | diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_program.h b/src/gallium/drivers/freedreno/a4xx/fd4_program.h index fe723606112..808e7646d95 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_program.h +++ b/src/gallium/drivers/freedreno/a4xx/fd4_program.h @@ -34,7 +34,7 @@ void fd4_emit_shader(struct fd_ringbuffer *ring, const struct ir3_shader_variant *so); void fd4_program_emit(struct fd_ringbuffer *ring, struct fd4_emit *emit, int nr, - struct pipe_surface **bufs); + struct pipe_surface *bufs); void fd4_prog_init(struct pipe_context *pctx); diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c index 9a5fdd08c8e..4f897f96d8a 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_draw.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_draw.c @@ -225,7 +225,7 @@ fd5_clear(struct fd_context *ctx, enum fd_buffer_mask buffers, struct pipe_framebuffer_state *pfb = &ctx->batch->framebuffer; if ((buffers & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL)) && - is_z32(pfb->zsbuf->format)) + is_z32(pfb->zsbuf.format)) return false; fd5_emit_render_cntl(ctx, true, false); @@ -234,13 +234,13 @@ fd5_clear(struct fd_context *ctx, enum fd_buffer_mask buffers, for (int i = 0; i < pfb->nr_cbufs; i++) { union util_color uc = {0}; - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; if (!(buffers & (PIPE_CLEAR_COLOR0 << i))) continue; - enum pipe_format pfmt = pfb->cbufs[i]->format; + enum pipe_format pfmt = pfb->cbufs[i].format; // XXX I think RB_CLEAR_COLOR_DWn wants to take into account SWAP?? union pipe_color_union swapped; @@ -290,8 +290,8 @@ fd5_clear(struct fd_context *ctx, enum fd_buffer_mask buffers, } } - if (pfb->zsbuf && (buffers & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL))) { - uint32_t clear = util_pack_z_stencil(pfb->zsbuf->format, depth, stencil); + if (pfb->zsbuf.texture && (buffers & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL))) { + uint32_t clear = util_pack_z_stencil(pfb->zsbuf.format, depth, stencil); uint32_t mask = 0; if (buffers & FD_BUFFER_DEPTH) @@ -312,8 +312,8 @@ fd5_clear(struct fd_context *ctx, enum fd_buffer_mask buffers, fd5_emit_blit(ctx->batch, ring); - if (pfb->zsbuf && (buffers & FD_BUFFER_DEPTH)) { - struct fd_resource *zsbuf = fd_resource(pfb->zsbuf->texture); + if (pfb->zsbuf.texture && (buffers & FD_BUFFER_DEPTH)) { + struct fd_resource *zsbuf = fd_resource(pfb->zsbuf.texture); if (zsbuf->lrz) { zsbuf->lrz_valid = true; fd5_clear_lrz(ctx->batch, zsbuf, depth); diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_emit.c b/src/gallium/drivers/freedreno/a5xx/fd5_emit.c index 813729727bf..0fc2456fece 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_emit.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_emit.c @@ -511,7 +511,7 @@ fd5_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring, unsigned char mrt_comp[A5XX_MAX_RENDER_TARGETS] = {0}; for (unsigned i = 0; i < A5XX_MAX_RENDER_TARGETS; i++) { - mrt_comp[i] = ((i < pfb->nr_cbufs) && pfb->cbufs[i]) ? 0xf : 0; + mrt_comp[i] = ((i < pfb->nr_cbufs) && pfb->cbufs[i].texture) ? 0xf : 0; } OUT_PKT4(ring, REG_A5XX_RB_RENDER_COMPONENTS, 1); @@ -529,7 +529,7 @@ fd5_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring, struct fd5_zsa_stateobj *zsa = fd5_zsa_stateobj(ctx->zsa); uint32_t rb_alpha_control = zsa->rb_alpha_control; - if (util_format_is_pure_integer(pipe_surface_format(pfb->cbufs[0]))) + if (util_format_is_pure_integer(pipe_surface_format(&pfb->cbufs[0]))) rb_alpha_control &= ~A5XX_RB_ALPHA_CONTROL_ALPHA_TEST; OUT_PKT4(ring, REG_A5XX_RB_ALPHA_CONTROL, 1); @@ -543,8 +543,8 @@ fd5_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring, struct fd5_blend_stateobj *blend = fd5_blend_stateobj(ctx->blend); struct fd5_zsa_stateobj *zsa = fd5_zsa_stateobj(ctx->zsa); - if (pfb->zsbuf) { - struct fd_resource *rsc = fd_resource(pfb->zsbuf->texture); + if (pfb->zsbuf.texture) { + struct fd_resource *rsc = fd_resource(pfb->zsbuf.texture); uint32_t gras_lrz_cntl = zsa->gras_lrz_cntl; if (emit->no_lrz_write || !rsc->lrz || !rsc->lrz_valid) @@ -767,7 +767,7 @@ fd5_emit_state(struct fd_context *ctx, struct fd_ringbuffer *ring, uint32_t i; for (i = 0; i < A5XX_MAX_RENDER_TARGETS; i++) { - enum pipe_format format = pipe_surface_format(pfb->cbufs[i]); + enum pipe_format format = pipe_surface_format(&pfb->cbufs[i]); bool is_int = util_format_is_pure_integer(format); bool has_alpha = util_format_has_alpha(format); uint32_t control = blend->rb_mrt[i].control; diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c b/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c index a7ba587c570..d3b37a854bc 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c @@ -26,7 +26,7 @@ static void emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs, - struct pipe_surface **bufs, const struct fd_gmem_stateobj *gmem) + struct pipe_surface *bufs, const struct fd_gmem_stateobj *gmem) { enum a5xx_tile_mode tile_mode; unsigned i; @@ -47,8 +47,8 @@ emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs, tile_mode = TILE5_LINEAR; } - if ((i < nr_bufs) && bufs[i]) { - struct pipe_surface *psurf = bufs[i]; + if ((i < nr_bufs) && bufs[i].texture) { + struct pipe_surface *psurf = &bufs[i]; enum pipe_format pformat = psurf->format; rsc = fd_resource(psurf->texture); @@ -88,7 +88,7 @@ emit_mrt(struct fd_ringbuffer *ring, unsigned nr_bufs, COND(srgb, A5XX_RB_MRT_BUF_INFO_COLOR_SRGB)); OUT_RING(ring, A5XX_RB_MRT_PITCH(stride)); OUT_RING(ring, A5XX_RB_MRT_ARRAY_PITCH(size)); - if (gmem || (i >= nr_bufs) || !bufs[i]) { + if (gmem || (i >= nr_bufs) || !bufs[i].texture) { OUT_RING(ring, base); /* RB_MRT[i].BASE_LO */ OUT_RING(ring, 0x00000000); /* RB_MRT[i].BASE_HI */ } else { @@ -116,7 +116,7 @@ static void emit_zs(struct fd_ringbuffer *ring, struct pipe_surface *zsbuf, const struct fd_gmem_stateobj *gmem) { - if (zsbuf) { + if (zsbuf->texture) { struct fd_resource *rsc = fd_resource(zsbuf->texture); enum a5xx_depth_format fmt = fd5_pipe2depth(zsbuf->format); uint32_t cpp = rsc->layout.cpp; @@ -404,7 +404,7 @@ fd5_emit_tile_init(struct fd_batch *batch) assert_dt OUT_PKT4(ring, REG_A5XX_RB_CCU_CNTL, 1); OUT_RING(ring, 0x7c13c080); /* RB_CCU_CNTL */ - emit_zs(ring, pfb->zsbuf, batch->gmem_state); + emit_zs(ring, &pfb->zsbuf, batch->gmem_state); emit_mrt(ring, pfb->nr_cbufs, pfb->cbufs, batch->gmem_state); /* Enable stream output for the first pass (likely the binning). */ @@ -556,7 +556,7 @@ fd5_emit_tile_mem2gmem(struct fd_batch *batch, const struct fd_tile *tile) */ emit_mrt(ring, pfb->nr_cbufs, pfb->cbufs, NULL); - // emit_zs(ring, pfb->zsbuf, NULL); + // emit_zs(ring, &pfb->zsbuf, NULL); OUT_PKT4(ring, REG_A5XX_RB_CNTL, 1); OUT_RING(ring, A5XX_RB_CNTL_WIDTH(gmem->bin_w) | @@ -565,23 +565,23 @@ fd5_emit_tile_mem2gmem(struct fd_batch *batch, const struct fd_tile *tile) if (fd_gmem_needs_restore(batch, tile, FD_BUFFER_COLOR)) { unsigned i; for (i = 0; i < pfb->nr_cbufs; i++) { - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; if (!(batch->restore & (PIPE_CLEAR_COLOR0 << i))) continue; - emit_mem2gmem_surf(batch, gmem->cbuf_base[i], pfb->cbufs[i], + emit_mem2gmem_surf(batch, gmem->cbuf_base[i], &pfb->cbufs[i], BLIT_MRT0 + i); } } if (fd_gmem_needs_restore(batch, tile, FD_BUFFER_DEPTH | FD_BUFFER_STENCIL)) { - struct fd_resource *rsc = fd_resource(pfb->zsbuf->texture); + struct fd_resource *rsc = fd_resource(pfb->zsbuf.texture); if (!rsc->stencil || fd_gmem_needs_restore(batch, tile, FD_BUFFER_DEPTH)) - emit_mem2gmem_surf(batch, gmem->zsbuf_base[0], pfb->zsbuf, BLIT_ZS); + emit_mem2gmem_surf(batch, gmem->zsbuf_base[0], &pfb->zsbuf, BLIT_ZS); if (rsc->stencil && fd_gmem_needs_restore(batch, tile, FD_BUFFER_STENCIL)) - emit_mem2gmem_surf(batch, gmem->zsbuf_base[1], pfb->zsbuf, BLIT_S); + emit_mem2gmem_surf(batch, gmem->zsbuf_base[1], &pfb->zsbuf, BLIT_S); } } @@ -597,7 +597,7 @@ fd5_emit_tile_renderprep(struct fd_batch *batch, const struct fd_tile *tile) OUT_RING(ring, A5XX_RB_CNTL_WIDTH(gmem->bin_w) | A5XX_RB_CNTL_HEIGHT(gmem->bin_h)); - emit_zs(ring, pfb->zsbuf, gmem); + emit_zs(ring, &pfb->zsbuf, gmem); emit_mrt(ring, pfb->nr_cbufs, pfb->cbufs, gmem); emit_msaa(ring, pfb->samples); } @@ -660,22 +660,22 @@ fd5_emit_tile_gmem2mem(struct fd_batch *batch, const struct fd_tile *tile) struct pipe_framebuffer_state *pfb = &batch->framebuffer; if (batch->resolve & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL)) { - struct fd_resource *rsc = fd_resource(pfb->zsbuf->texture); + struct fd_resource *rsc = fd_resource(pfb->zsbuf.texture); if (!rsc->stencil || (batch->resolve & FD_BUFFER_DEPTH)) - emit_gmem2mem_surf(batch, gmem->zsbuf_base[0], pfb->zsbuf, BLIT_ZS); + emit_gmem2mem_surf(batch, gmem->zsbuf_base[0], &pfb->zsbuf, BLIT_ZS); if (rsc->stencil && (batch->resolve & FD_BUFFER_STENCIL)) - emit_gmem2mem_surf(batch, gmem->zsbuf_base[1], pfb->zsbuf, BLIT_S); + emit_gmem2mem_surf(batch, gmem->zsbuf_base[1], &pfb->zsbuf, BLIT_S); } if (batch->resolve & FD_BUFFER_COLOR) { unsigned i; for (i = 0; i < pfb->nr_cbufs; i++) { - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; if (!(batch->resolve & (PIPE_CLEAR_COLOR0 << i))) continue; - emit_gmem2mem_surf(batch, gmem->cbuf_base[i], pfb->cbufs[i], + emit_gmem2mem_surf(batch, gmem->cbuf_base[i], &pfb->cbufs[i], BLIT_MRT0 + i); } } @@ -757,7 +757,7 @@ fd5_emit_sysmem_prep(struct fd_batch *batch) assert_dt patch_draws(batch, IGNORE_VISIBILITY); - emit_zs(ring, pfb->zsbuf, NULL); + emit_zs(ring, &pfb->zsbuf, NULL); emit_mrt(ring, pfb->nr_cbufs, pfb->cbufs, NULL); emit_msaa(ring, pfb->samples); } diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.cc b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.cc index 7e16a9793df..576380baea9 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_blitter.cc +++ b/src/gallium/drivers/freedreno/a6xx/fd6_blitter.cc @@ -1127,9 +1127,9 @@ fd6_resolve_tile(struct fd_batch *batch, struct fd_ringbuffer *ring, OUT_REG(ring, A6XX_GRAS_2D_SRC_TL_X(0), - A6XX_GRAS_2D_SRC_BR_X(width - 1), + A6XX_GRAS_2D_SRC_BR_X(pipe_surface_width(psurf) - 1), A6XX_GRAS_2D_SRC_TL_Y(0), - A6XX_GRAS_2D_SRC_BR_Y(height - 1), + A6XX_GRAS_2D_SRC_BR_Y(pipe_surface_height(psurf) - 1), ); /* Enable scissor bit, which will take into account the window scissor @@ -1160,8 +1160,8 @@ fd6_resolve_tile(struct fd_batch *batch, struct fd_ringbuffer *ring, ), SP_PS_2D_SRC_SIZE( CHIP, - .width = width, - .height = height, + .width = pipe_surface_width(psurf), + .height = pipe_surface_height(psurf), ), SP_PS_2D_SRC( CHIP, diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_context.cc b/src/gallium/drivers/freedreno/a6xx/fd6_context.cc index a68b7fe186d..f2a4d4935c7 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_context.cc +++ b/src/gallium/drivers/freedreno/a6xx/fd6_context.cc @@ -118,7 +118,7 @@ fd6_vertex_state_delete(struct pipe_context *pctx, void *hwcso) } static void -validate_surface(struct pipe_context *pctx, struct pipe_surface *psurf) +validate_surface(struct pipe_context *pctx, const struct pipe_surface *psurf) assert_dt { fd6_validate_format(fd_context(pctx), fd_resource(psurf->texture), @@ -130,13 +130,13 @@ fd6_set_framebuffer_state(struct pipe_context *pctx, const struct pipe_framebuffer_state *pfb) in_dt { - if (pfb->zsbuf) - validate_surface(pctx, pfb->zsbuf); + if (pfb->zsbuf.texture) + validate_surface(pctx, &pfb->zsbuf); for (unsigned i = 0; i < pfb->nr_cbufs; i++) { - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; - validate_surface(pctx, pfb->cbufs[i]); + validate_surface(pctx, &pfb->cbufs[i]); } fd_set_framebuffer_state(pctx, pfb); diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_draw.cc b/src/gallium/drivers/freedreno/a6xx/fd6_draw.cc index ff0d887b960..93835305ab5 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_draw.cc +++ b/src/gallium/drivers/freedreno/a6xx/fd6_draw.cc @@ -583,10 +583,10 @@ do_lrz_clear(struct fd_context *ctx, enum fd_buffer_mask buffers) { struct pipe_framebuffer_state *pfb = &ctx->batch->framebuffer; - if (!pfb->zsbuf) + if (!pfb->zsbuf.texture) return false; - struct fd_resource *zsbuf = fd_resource(pfb->zsbuf->texture); + struct fd_resource *zsbuf = fd_resource(pfb->zsbuf.texture); return (buffers & FD_BUFFER_DEPTH) && zsbuf->lrz; } @@ -626,7 +626,7 @@ fd6_clear(struct fd_context *ctx, enum fd_buffer_mask buffers, * would cause LRZ state to be invalid. */ if (do_lrz_clear(ctx, buffers)) { - struct fd_resource *zsbuf = fd_resource(pfb->zsbuf->texture); + struct fd_resource *zsbuf = fd_resource(pfb->zsbuf.texture); fd_bo_del(subpass->lrz); subpass->lrz = fd_bo_new(ctx->screen->dev, fd_bo_size(zsbuf->lrz), @@ -637,7 +637,7 @@ fd6_clear(struct fd_context *ctx, enum fd_buffer_mask buffers, } if (do_lrz_clear(ctx, buffers)) { - struct fd_resource *zsbuf = fd_resource(pfb->zsbuf->texture); + struct fd_resource *zsbuf = fd_resource(pfb->zsbuf.texture); zsbuf->lrz_valid = true; zsbuf->lrz_direction = FD_LRZ_UNKNOWN; diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_emit.cc b/src/gallium/drivers/freedreno/a6xx/fd6_emit.cc index e2b579bc691..c91985a5969 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_emit.cc +++ b/src/gallium/drivers/freedreno/a6xx/fd6_emit.cc @@ -116,7 +116,7 @@ compute_lrz_state(struct fd6_emit *emit) assert_dt struct pipe_framebuffer_state *pfb = &ctx->batch->framebuffer; struct fd6_lrz_state lrz; - if (!pfb->zsbuf) { + if (!pfb->zsbuf.texture) { memset(&lrz, 0, sizeof(lrz)); lrz.z_mode = compute_ztest_mode(emit, false); return lrz; @@ -124,7 +124,7 @@ compute_lrz_state(struct fd6_emit *emit) assert_dt struct fd6_blend_stateobj *blend = fd6_blend_stateobj(ctx->blend); struct fd6_zsa_stateobj *zsa = fd6_zsa_stateobj(ctx->zsa); - struct fd_resource *rsc = fd_resource(pfb->zsbuf->texture); + struct fd_resource *rsc = fd_resource(pfb->zsbuf.texture); bool reads_dest = blend->reads_dest; lrz = zsa->lrz; @@ -329,7 +329,7 @@ build_prog_fb_rast(struct fd6_emit *emit) assert_dt unsigned mrt_components = 0; for (unsigned i = 0; i < pfb->nr_cbufs; i++) { - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; mrt_components |= 0xf << (i * 4); } @@ -611,7 +611,7 @@ fd6_emit_3d_state(struct fd_ringbuffer *ring, struct fd6_emit *emit) case FD6_GROUP_ZSA: state = fd6_zsa_state( ctx, - util_format_is_pure_integer(pipe_surface_format(pfb->cbufs[0])), + util_format_is_pure_integer(pipe_surface_format(&pfb->cbufs[0])), fd_depth_clamp_enabled(ctx)); fd6_state_add_group(&emit->state, state, FD6_GROUP_ZSA); break; diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_gmem.cc b/src/gallium/drivers/freedreno/a6xx/fd6_gmem.cc index cb3fe974ca7..2e403dca4c2 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_gmem.cc +++ b/src/gallium/drivers/freedreno/a6xx/fd6_gmem.cc @@ -79,10 +79,10 @@ emit_mrt(struct fd_ringbuffer *ring, struct pipe_framebuffer_state *pfb, uint32_t array_stride = 0; uint32_t offset; - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; - struct pipe_surface *psurf = pfb->cbufs[i]; + struct pipe_surface *psurf = &pfb->cbufs[i]; enum pipe_format pformat = psurf->format; rsc = fd_resource(psurf->texture); @@ -133,8 +133,8 @@ emit_mrt(struct fd_ringbuffer *ring, struct pipe_framebuffer_state *pfb, if (i == 0) mrt0_format = format; } - if (pfb->zsbuf) - max_layer_index = pfb->zsbuf->u.tex.last_layer - pfb->zsbuf->u.tex.first_layer; + if (pfb->zsbuf.texture) + max_layer_index = pfb->zsbuf.u.tex.last_layer - pfb->zsbuf.u.tex.first_layer; OUT_REG(ring, A6XX_GRAS_LRZ_MRT_BUF_INFO_0(.color_format = mrt0_format)); @@ -149,7 +149,7 @@ static void emit_zs(struct fd_context *ctx, struct fd_ringbuffer *ring, struct pipe_surface *zsbuf, const struct fd_gmem_stateobj *gmem) { - if (zsbuf) { + if (zsbuf->texture) { struct fd_resource *rsc = fd_resource(zsbuf->texture); struct fd_resource *stencil = rsc->stencil; uint32_t stride = fd_resource_pitch(rsc, zsbuf->u.tex.level); @@ -269,7 +269,7 @@ emit_lrz(struct fd_batch *batch, struct fd_batch_subpass *subpass) */ fd6_event_write(batch->ctx, ring, FD_LRZ_FLUSH); - struct fd_resource *zsbuf = fd_resource(pfb->zsbuf->texture); + struct fd_resource *zsbuf = fd_resource(pfb->zsbuf.texture); OUT_REG(ring, A6XX_GRAS_LRZ_BUFFER_BASE(.bo = subpass->lrz), A6XX_GRAS_LRZ_BUFFER_PITCH(.pitch = zsbuf->lrz_layout.lrz_pitch), @@ -283,7 +283,7 @@ emit_lrz(struct fd_batch *batch, struct fd_batch_subpass *subpass) if (CHIP >= A7XX) { OUT_REG(ring, A7XX_GRAS_LRZ_DEPTH_BUFFER_INFO( - .depth_format = fd6_pipe2depth(pfb->zsbuf->format), + .depth_format = fd6_pipe2depth(pfb->zsbuf.format), ) ); } @@ -299,10 +299,10 @@ emit_lrz_clears(struct fd_batch *batch) struct fd_context *ctx = batch->ctx; unsigned count = 0; - if (!pfb->zsbuf) + if (!pfb->zsbuf.texture) return; - struct fd_resource *zsbuf = fd_resource(pfb->zsbuf->texture); + struct fd_resource *zsbuf = fd_resource(pfb->zsbuf.texture); foreach_subpass (subpass, batch) { /* The lrz buffer isn't explicitly tracked by the batch resource @@ -393,7 +393,7 @@ patch_fb_read_gmem(struct fd_batch *batch) struct fd_cs_patch *patch = fd_patch_element(&batch->fb_read_patches, i); int buf = patch->val; - struct pipe_surface *psurf = pfb->cbufs[buf]; + struct pipe_surface *psurf = &pfb->cbufs[buf]; struct pipe_resource *prsc = psurf->texture; struct fd_resource *rsc = fd_resource(prsc); enum pipe_format format = psurf->format; @@ -449,8 +449,8 @@ patch_fb_read_sysmem(struct fd_batch *batch) fd_patch_element(&batch->fb_read_patches, i); int buf = patch->val; - struct pipe_surface *psurf = pfb->cbufs[buf]; - if (!psurf) + struct pipe_surface *psurf = &pfb->cbufs[buf]; + if (!psurf->texture) return; struct pipe_resource *prsc = psurf->texture; @@ -514,17 +514,17 @@ update_render_cntl(struct fd_batch *batch, struct pipe_framebuffer_state *pfb, uint32_t mrts_ubwc_enable = 0; int i; - if (pfb->zsbuf) { - struct fd_resource *rsc = fd_resource(pfb->zsbuf->texture); + if (pfb->zsbuf.texture) { + struct fd_resource *rsc = fd_resource(pfb->zsbuf.texture); depth_ubwc_enable = - fd_resource_ubwc_enabled(rsc, pfb->zsbuf->u.tex.level); + fd_resource_ubwc_enabled(rsc, pfb->zsbuf.u.tex.level); } for (i = 0; i < pfb->nr_cbufs; i++) { - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; - struct pipe_surface *psurf = pfb->cbufs[i]; + struct pipe_surface *psurf = &pfb->cbufs[i]; struct fd_resource *rsc = fd_resource(psurf->texture); if (fd_resource_ubwc_enabled(rsc, psurf->u.tex.level)) @@ -1143,7 +1143,7 @@ fd6_emit_tile_init(struct fd_batch *batch) assert_dt fd6_emit_ccu_cntl(ring, screen, true); - emit_zs(batch->ctx, ring, pfb->zsbuf, batch->gmem_state); + emit_zs(batch->ctx, ring, &pfb->zsbuf, batch->gmem_state); emit_mrt(ring, pfb, batch->gmem_state); emit_msaa(ring, pfb->samples); patch_fb_read_gmem(batch); @@ -1263,7 +1263,7 @@ fd6_emit_tile_prep(struct fd_batch *batch, const struct fd_tile *tile) fd6_emit_ccu_cntl(ring, screen, true); - emit_zs(batch->ctx, ring, pfb->zsbuf, batch->gmem_state); + emit_zs(batch->ctx, ring, &pfb->zsbuf, batch->gmem_state); emit_mrt(ring, pfb, batch->gmem_state); emit_msaa(ring, pfb->samples); @@ -1466,13 +1466,13 @@ emit_subpass_clears(struct fd_batch *batch, struct fd_batch_subpass *subpass) union pipe_color_union *color = &subpass->clear_color[i]; union util_color uc = {0}; - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; if (!(buffers & (PIPE_CLEAR_COLOR0 << i))) continue; - enum pipe_format pfmt = pfb->cbufs[i]->format; + enum pipe_format pfmt = pfb->cbufs[i].format; // XXX I think RB_CLEAR_COLOR_DWn wants to take into account SWAP?? union pipe_color_union swapped; @@ -1534,22 +1534,22 @@ emit_subpass_clears(struct fd_batch *batch, struct fd_batch_subpass *subpass) } } - const bool has_depth = pfb->zsbuf; + const bool has_depth = !!pfb->zsbuf.texture; const bool has_separate_stencil = - has_depth && fd_resource(pfb->zsbuf->texture)->stencil; + has_depth && fd_resource(pfb->zsbuf.texture)->stencil; /* First clear depth or combined depth/stencil. */ if ((has_depth && (buffers & PIPE_CLEAR_DEPTH)) || (!has_separate_stencil && (buffers & PIPE_CLEAR_STENCIL))) { - enum pipe_format pfmt = pfb->zsbuf->format; + enum pipe_format pfmt = pfb->zsbuf.format; uint32_t clear_value; uint32_t mask = 0; if (has_separate_stencil) { - pfmt = util_format_get_depth_only(pfb->zsbuf->format); + pfmt = util_format_get_depth_only(pfb->zsbuf.format); clear_value = util_pack_z(pfmt, subpass->clear_depth); } else { - pfmt = pfb->zsbuf->format; + pfmt = pfb->zsbuf.format; clear_value = util_pack_z_stencil(pfmt, subpass->clear_depth, subpass->clear_stencil); } @@ -1622,24 +1622,24 @@ emit_restore_blits(struct fd_batch *batch, struct fd_ringbuffer *ring) if (batch->restore & FD_BUFFER_COLOR) { unsigned i; for (i = 0; i < pfb->nr_cbufs; i++) { - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; if (!(batch->restore & (PIPE_CLEAR_COLOR0 << i))) continue; - emit_restore_blit(batch, ring, gmem->cbuf_base[i], pfb->cbufs[i], + emit_restore_blit(batch, ring, gmem->cbuf_base[i], &pfb->cbufs[i], FD_BUFFER_COLOR); } } if (batch->restore & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL)) { - struct fd_resource *rsc = fd_resource(pfb->zsbuf->texture); + struct fd_resource *rsc = fd_resource(pfb->zsbuf.texture); if (!rsc->stencil || (batch->restore & FD_BUFFER_DEPTH)) { - emit_restore_blit(batch, ring, gmem->zsbuf_base[0], pfb->zsbuf, + emit_restore_blit(batch, ring, gmem->zsbuf_base[0], &pfb->zsbuf, FD_BUFFER_DEPTH); } if (rsc->stencil && (batch->restore & FD_BUFFER_STENCIL)) { - emit_restore_blit(batch, ring, gmem->zsbuf_base[1], pfb->zsbuf, + emit_restore_blit(batch, ring, gmem->zsbuf_base[1], &pfb->zsbuf, FD_BUFFER_STENCIL); } } @@ -1821,27 +1821,27 @@ prepare_tile_fini(struct fd_batch *batch) set_blit_scissor(batch, ring); if (batch->resolve & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL)) { - struct fd_resource *rsc = fd_resource(pfb->zsbuf->texture); + struct fd_resource *rsc = fd_resource(pfb->zsbuf.texture); if (!rsc->stencil || (batch->resolve & FD_BUFFER_DEPTH)) { emit_resolve_blit(batch, ring, gmem->zsbuf_base[0], - pfb->zsbuf, FD_BUFFER_DEPTH); + &pfb->zsbuf, FD_BUFFER_DEPTH); } if (rsc->stencil && (batch->resolve & FD_BUFFER_STENCIL)) { emit_resolve_blit(batch, ring, gmem->zsbuf_base[1], - pfb->zsbuf, FD_BUFFER_STENCIL); + &pfb->zsbuf, FD_BUFFER_STENCIL); } } if (batch->resolve & FD_BUFFER_COLOR) { unsigned i; for (i = 0; i < pfb->nr_cbufs; i++) { - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; if (!(batch->resolve & (PIPE_CLEAR_COLOR0 << i))) continue; emit_resolve_blit(batch, ring, gmem->cbuf_base[i], - pfb->cbufs[i], FD_BUFFER_COLOR); + &pfb->cbufs[i], FD_BUFFER_COLOR); } } } @@ -1948,35 +1948,35 @@ emit_sysmem_clears(struct fd_batch *batch, struct fd_batch_subpass *subpass) for (int i = 0; i < pfb->nr_cbufs; i++) { union pipe_color_union color = subpass->clear_color[i]; - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; if (!(buffers & (PIPE_CLEAR_COLOR0 << i))) continue; - fd6_clear_surface(ctx, ring, pfb->cbufs[i], &box2d, &color, 0); + fd6_clear_surface(ctx, ring, &pfb->cbufs[i], &box2d, &color, 0); } } if (buffers & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) { union pipe_color_union value = {}; - const bool has_depth = pfb->zsbuf; + const bool has_depth = !!pfb->zsbuf.texture; struct pipe_resource *separate_stencil = - has_depth && fd_resource(pfb->zsbuf->texture)->stencil - ? &fd_resource(pfb->zsbuf->texture)->stencil->b.b + has_depth && fd_resource(pfb->zsbuf.texture)->stencil + ? &fd_resource(pfb->zsbuf.texture)->stencil->b.b : NULL; if ((buffers & PIPE_CLEAR_DEPTH) || (!separate_stencil && (buffers & PIPE_CLEAR_STENCIL))) { value.f[0] = subpass->clear_depth; value.ui[1] = subpass->clear_stencil; - fd6_clear_surface(ctx, ring, pfb->zsbuf, &box2d, - &value, fd6_unknown_8c01(pfb->zsbuf->format, buffers)); + fd6_clear_surface(ctx, ring, &pfb->zsbuf, &box2d, + &value, fd6_unknown_8c01(pfb->zsbuf.format, buffers)); } if (separate_stencil && (buffers & PIPE_CLEAR_STENCIL)) { value.ui[0] = subpass->clear_stencil; - struct pipe_surface stencil_surf = *pfb->zsbuf; + struct pipe_surface stencil_surf = pfb->zsbuf; stencil_surf.format = PIPE_FORMAT_S8_UINT; stencil_surf.texture = separate_stencil; @@ -2055,7 +2055,7 @@ fd6_emit_sysmem_prep(struct fd_batch *batch) assert_dt OUT_PKT7(ring, CP_SET_VISIBILITY_OVERRIDE, 1); OUT_RING(ring, 0x1); - emit_zs(batch->ctx, ring, pfb->zsbuf, NULL); + emit_zs(batch->ctx, ring, &pfb->zsbuf, NULL); emit_mrt(ring, pfb, NULL); emit_msaa(ring, pfb->samples); patch_fb_read_sysmem(batch); diff --git a/src/gallium/drivers/freedreno/freedreno_autotune.c b/src/gallium/drivers/freedreno/freedreno_autotune.c index d8ffec9ee9e..aa8bf9afdcb 100644 --- a/src/gallium/drivers/freedreno/freedreno_autotune.c +++ b/src/gallium/drivers/freedreno/freedreno_autotune.c @@ -173,7 +173,7 @@ fd_autotune_use_bypass(struct fd_autotune *at, struct fd_batch *batch) * implement a temporary render target that we can MSAA resolve * from */ - if (pfb->cbufs[i] && pfb->cbufs[i]->nr_samples) + if (pfb->cbufs[i].texture && pfb->cbufs[i].nr_samples) return fallback_use_bypass(batch); } diff --git a/src/gallium/drivers/freedreno/freedreno_batch.c b/src/gallium/drivers/freedreno/freedreno_batch.c index bc2a109b964..4f588e31c93 100644 --- a/src/gallium/drivers/freedreno/freedreno_batch.c +++ b/src/gallium/drivers/freedreno/freedreno_batch.c @@ -389,10 +389,10 @@ fd_batch_set_fb(struct fd_batch *batch, const struct pipe_framebuffer_state *pfb util_copy_framebuffer_state(&batch->framebuffer, pfb); - if (!pfb->zsbuf) + if (!pfb->zsbuf.texture) return; - struct fd_resource *zsbuf = fd_resource(pfb->zsbuf->texture); + struct fd_resource *zsbuf = fd_resource(pfb->zsbuf.texture); /* Switching back to a batch we'd previously started constructing shouldn't * result in a different lrz. The dependency tracking should avoid another diff --git a/src/gallium/drivers/freedreno/freedreno_batch_cache.c b/src/gallium/drivers/freedreno/freedreno_batch_cache.c index 3e578ceac01..aa55651e2f4 100644 --- a/src/gallium/drivers/freedreno/freedreno_batch_cache.c +++ b/src/gallium/drivers/freedreno/freedreno_batch_cache.c @@ -544,7 +544,7 @@ batch_from_key(struct fd_context *ctx, struct fd_batch_key *key) assert_dt static void key_surf(struct fd_batch_key *key, unsigned idx, unsigned pos, - struct pipe_surface *psurf) + const struct pipe_surface *psurf) { key->surf[idx].texture = psurf->texture; key->surf[idx].u = psurf->u; @@ -557,7 +557,7 @@ struct fd_batch * fd_batch_from_fb(struct fd_context *ctx, const struct pipe_framebuffer_state *pfb) { - unsigned idx = 0, n = pfb->nr_cbufs + (pfb->zsbuf ? 1 : 0); + unsigned idx = 0, n = pfb->nr_cbufs + (pfb->zsbuf.texture ? 1 : 0); struct fd_batch_key *key = key_alloc(n); key->width = pfb->width; @@ -566,12 +566,12 @@ fd_batch_from_fb(struct fd_context *ctx, key->samples = util_framebuffer_get_num_samples(pfb); key->ctx_seqno = ctx->seqno; - if (pfb->zsbuf) - key_surf(key, idx++, 0, pfb->zsbuf); + if (pfb->zsbuf.texture) + key_surf(key, idx++, 0, &pfb->zsbuf); for (unsigned i = 0; i < pfb->nr_cbufs; i++) - if (pfb->cbufs[i]) - key_surf(key, idx++, i + 1, pfb->cbufs[i]); + if (pfb->cbufs[i].texture) + key_surf(key, idx++, i + 1, &pfb->cbufs[i]); key->num_surfs = idx; diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c index 02583f67ae3..493bead2a3f 100644 --- a/src/gallium/drivers/freedreno/freedreno_draw.c +++ b/src/gallium/drivers/freedreno/freedreno_draw.c @@ -57,12 +57,12 @@ batch_draw_tracking_for_dirty_bits(struct fd_batch *batch) assert_dt if (dirty & (FD_DIRTY_FRAMEBUFFER | FD_DIRTY_ZSA)) { if (fd_depth_enabled(ctx)) { - if (fd_resource(pfb->zsbuf->texture)->valid) { + if (fd_resource(pfb->zsbuf.texture)->valid) { restore_buffers |= FD_BUFFER_DEPTH; /* storing packed d/s depth also stores stencil, so we need * the stencil restored too to avoid invalidating it. */ - if (pfb->zsbuf->texture->format == PIPE_FORMAT_Z24_UNORM_S8_UINT) + if (pfb->zsbuf.texture->format == PIPE_FORMAT_Z24_UNORM_S8_UINT) restore_buffers |= FD_BUFFER_STENCIL; } else { batch->invalidated |= FD_BUFFER_DEPTH; @@ -70,26 +70,26 @@ batch_draw_tracking_for_dirty_bits(struct fd_batch *batch) assert_dt batch->gmem_reason |= FD_GMEM_DEPTH_ENABLED; if (fd_depth_write_enabled(ctx)) { buffers |= FD_BUFFER_DEPTH; - resource_written(batch, pfb->zsbuf->texture); + resource_written(batch, pfb->zsbuf.texture); } else { - resource_read(batch, pfb->zsbuf->texture); + resource_read(batch, pfb->zsbuf.texture); } } if (fd_stencil_enabled(ctx)) { - if (fd_resource(pfb->zsbuf->texture)->valid) { + if (fd_resource(pfb->zsbuf.texture)->valid) { restore_buffers |= FD_BUFFER_STENCIL; /* storing packed d/s stencil also stores depth, so we need * the depth restored too to avoid invalidating it. */ - if (pfb->zsbuf->texture->format == PIPE_FORMAT_Z24_UNORM_S8_UINT) + if (pfb->zsbuf.texture->format == PIPE_FORMAT_Z24_UNORM_S8_UINT) restore_buffers |= FD_BUFFER_DEPTH; } else { batch->invalidated |= FD_BUFFER_STENCIL; } batch->gmem_reason |= FD_GMEM_STENCIL_ENABLED; buffers |= FD_BUFFER_STENCIL; - resource_written(batch, pfb->zsbuf->texture); + resource_written(batch, pfb->zsbuf.texture); } } @@ -97,10 +97,10 @@ batch_draw_tracking_for_dirty_bits(struct fd_batch *batch) assert_dt for (unsigned i = 0; i < pfb->nr_cbufs; i++) { struct pipe_resource *surf; - if (!pfb->cbufs[i]) + if (!pfb->cbufs[i].texture) continue; - surf = pfb->cbufs[i]->texture; + surf = pfb->cbufs[i].texture; if (fd_resource(surf)->valid) { restore_buffers |= PIPE_CLEAR_COLOR0 << i; @@ -110,7 +110,7 @@ batch_draw_tracking_for_dirty_bits(struct fd_batch *batch) assert_dt buffers |= PIPE_CLEAR_COLOR0 << i; - resource_written(batch, pfb->cbufs[i]->texture); + resource_written(batch, pfb->cbufs[i].texture); } } @@ -371,8 +371,8 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info, struct pipe_framebuffer_state *pfb = &batch->framebuffer; DBG("%p: %ux%u num_draws=%u (%s/%s)", batch, pfb->width, pfb->height, batch->num_draws, - util_format_short_name(pipe_surface_format(pfb->cbufs[0])), - util_format_short_name(pipe_surface_format(pfb->zsbuf))); + util_format_short_name(pipe_surface_format(&pfb->cbufs[0])), + util_format_short_name(pipe_surface_format(&pfb->zsbuf))); batch->cost += ctx->draw_cost; @@ -444,10 +444,10 @@ batch_clear_tracking(struct fd_batch *batch, unsigned buffers) assert_dt if (buffers & PIPE_CLEAR_COLOR) for (unsigned i = 0; i < pfb->nr_cbufs; i++) if (buffers & (PIPE_CLEAR_COLOR0 << i)) - resource_written(batch, pfb->cbufs[i]->texture); + resource_written(batch, pfb->cbufs[i].texture); if (buffers & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) { - resource_written(batch, pfb->zsbuf->texture); + resource_written(batch, pfb->zsbuf.texture); batch->gmem_reason |= FD_GMEM_CLEARS_DEPTH_STENCIL; } @@ -495,8 +495,8 @@ fd_clear(struct pipe_context *pctx, unsigned buffers, struct pipe_framebuffer_state *pfb = &batch->framebuffer; DBG("%p: %x %ux%u depth=%f, stencil=%u (%s/%s)", batch, buffers, pfb->width, pfb->height, depth, stencil, - util_format_short_name(pipe_surface_format(pfb->cbufs[0])), - util_format_short_name(pipe_surface_format(pfb->zsbuf))); + util_format_short_name(pipe_surface_format(&pfb->cbufs[0])), + util_format_short_name(pipe_surface_format(&pfb->zsbuf))); /* if per-gen backend doesn't implement ctx->clear() generic * blitter clear: diff --git a/src/gallium/drivers/freedreno/freedreno_gmem.c b/src/gallium/drivers/freedreno/freedreno_gmem.c index f7fa59788cf..e0ae0902232 100644 --- a/src/gallium/drivers/freedreno/freedreno_gmem.c +++ b/src/gallium/drivers/freedreno/freedreno_gmem.c @@ -455,13 +455,13 @@ gmem_key_init(struct fd_batch *batch, bool assume_zs, bool no_scis_opt) { struct fd_screen *screen = batch->ctx->screen; struct pipe_framebuffer_state *pfb = &batch->framebuffer; - bool has_zs = pfb->zsbuf && + bool has_zs = pfb->zsbuf.texture && !!(batch->gmem_reason & (FD_GMEM_DEPTH_ENABLED | FD_GMEM_STENCIL_ENABLED | FD_GMEM_CLEARS_DEPTH_STENCIL)); struct gmem_key *key = rzalloc(screen->gmem_cache.ht, struct gmem_key); if (has_zs || assume_zs) { - struct fd_resource *rsc = fd_resource(pfb->zsbuf->texture); + struct fd_resource *rsc = fd_resource(pfb->zsbuf.texture); key->zsbuf_cpp[0] = rsc->layout.cpp * pfb->samples; if (rsc->stencil) key->zsbuf_cpp[1] = rsc->stencil->layout.cpp * pfb->samples; @@ -478,7 +478,7 @@ gmem_key_init(struct fd_batch *batch, bool assume_zs, bool no_scis_opt) unsigned zsclear = batch->cleared & (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL); if (zsclear) { const struct util_format_description *desc = - util_format_description(pfb->zsbuf->format); + util_format_description(pfb->zsbuf.format); if (util_format_has_depth(desc) && !(zsclear & FD_BUFFER_DEPTH)) batch->restore |= FD_BUFFER_DEPTH; if (util_format_has_stencil(desc) && !(zsclear & FD_BUFFER_STENCIL)) @@ -492,8 +492,8 @@ gmem_key_init(struct fd_batch *batch, bool assume_zs, bool no_scis_opt) key->nr_cbufs = pfb->nr_cbufs; for (unsigned i = 0; i < pfb->nr_cbufs; i++) { - if (pfb->cbufs[i]) - key->cbuf_cpp[i] = util_format_get_blocksize(pfb->cbufs[i]->format); + if (pfb->cbufs[i].texture) + key->cbuf_cpp[i] = util_format_get_blocksize(pfb->cbufs[i].format); else key->cbuf_cpp[i] = 4; /* if MSAA, color buffers are super-sampled in GMEM: */ @@ -727,7 +727,7 @@ fd_gmem_render_tiles(struct fd_batch *batch) } /* For ARB_framebuffer_no_attachments: */ - if ((pfb->nr_cbufs == 0) && !pfb->zsbuf) { + if ((pfb->nr_cbufs == 0) && !pfb->zsbuf.texture) { sysmem = true; } } @@ -737,13 +737,13 @@ fd_gmem_render_tiles(struct fd_batch *batch) /* Layered rendering always needs bypass. */ for (unsigned i = 0; i < pfb->nr_cbufs; i++) { - struct pipe_surface *psurf = pfb->cbufs[i]; - if (!psurf) + struct pipe_surface *psurf = &pfb->cbufs[i]; + if (!psurf->texture) continue; if (psurf->u.tex.first_layer < psurf->u.tex.last_layer) sysmem = true; } - if (pfb->zsbuf && pfb->zsbuf->u.tex.first_layer < pfb->zsbuf->u.tex.last_layer) + if (pfb->zsbuf.texture && pfb->zsbuf.u.tex.first_layer < pfb->zsbuf.u.tex.last_layer) sysmem = true; /* Tessellation doesn't seem to support tiled rendering so fall back to @@ -766,8 +766,8 @@ fd_gmem_render_tiles(struct fd_batch *batch) } else if (sysmem) { trace_render_sysmem(&batch->trace, batch->gmem); trace_start_render_pass(&batch->trace, batch->gmem, - ctx->submit_count, pipe_surface_format(pfb->cbufs[0]), - pipe_surface_format(pfb->zsbuf), pfb->width, pfb->height, + ctx->submit_count, pipe_surface_format(&pfb->cbufs[0]), + pipe_surface_format(&pfb->zsbuf), pfb->width, pfb->height, pfb->nr_cbufs, pfb->samples, 0, 0, 0); if (ctx->query_prepare) ctx->query_prepare(batch, 1); @@ -780,8 +780,8 @@ fd_gmem_render_tiles(struct fd_batch *batch) trace_render_gmem(&batch->trace, batch->gmem, gmem->nbins_x, gmem->nbins_y, gmem->bin_w, gmem->bin_h); trace_start_render_pass(&batch->trace, batch->gmem, - ctx->submit_count, pipe_surface_format(pfb->cbufs[0]), - pipe_surface_format(pfb->zsbuf), pfb->width, pfb->height, + ctx->submit_count, pipe_surface_format(&pfb->cbufs[0]), + pipe_surface_format(&pfb->zsbuf), pfb->width, pfb->height, pfb->nr_cbufs, pfb->samples, gmem->nbins_x * gmem->nbins_y, gmem->bin_w, gmem->bin_h); if (ctx->query_prepare) @@ -810,7 +810,7 @@ fd_gmem_estimate_bins_per_pipe(struct fd_batch *batch) { struct pipe_framebuffer_state *pfb = &batch->framebuffer; struct fd_screen *screen = batch->ctx->screen; - struct fd_gmem_stateobj *gmem = lookup_gmem_state(batch, !!pfb->zsbuf, true); + struct fd_gmem_stateobj *gmem = lookup_gmem_state(batch, !!pfb->zsbuf.texture, true); unsigned nbins = gmem->maxpw * gmem->maxph; fd_screen_lock(screen); diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index 4a1dc734d3c..7789e088e7d 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -1615,13 +1615,13 @@ fd_invalidate_resource(struct pipe_context *pctx, struct fd_batch *batch = rsc->track->write_batch; struct pipe_framebuffer_state *pfb = &batch->framebuffer; - if (pfb->zsbuf && pfb->zsbuf->texture == prsc) { + if (pfb->zsbuf.texture == prsc) { batch->resolve &= ~(FD_BUFFER_DEPTH | FD_BUFFER_STENCIL); fd_dirty_resource(ctx, prsc, FD_DIRTY_ZSA, true); } for (unsigned i = 0; i < pfb->nr_cbufs; i++) { - if (pfb->cbufs[i] && pfb->cbufs[i]->texture == prsc) { + if (pfb->cbufs[i].texture == prsc) { batch->resolve &= ~(PIPE_CLEAR_COLOR0 << i); fd_dirty_resource(ctx, prsc, FD_DIRTY_FRAMEBUFFER, true); } diff --git a/src/gallium/drivers/freedreno/freedreno_state.c b/src/gallium/drivers/freedreno/freedreno_state.c index ac0f29fce62..4ef044366fb 100644 --- a/src/gallium/drivers/freedreno/freedreno_state.c +++ b/src/gallium/drivers/freedreno/freedreno_state.c @@ -300,10 +300,10 @@ fd_set_framebuffer_state(struct pipe_context *pctx, * created. */ for (unsigned i = 0; i < framebuffer->nr_cbufs; i++) { - if (!framebuffer->cbufs[i]) + if (!framebuffer->cbufs[i].texture) continue; - enum pipe_format format = framebuffer->cbufs[i]->format; + enum pipe_format format = framebuffer->cbufs[i].format; unsigned nr = util_format_get_nr_components(format); ctx->all_mrt_channel_mask |= BITFIELD_MASK(nr) << (4 * i); @@ -325,7 +325,7 @@ fd_set_framebuffer_state(struct pipe_context *pctx, fd_batch_reference(&old_batch, NULL); } else if (ctx->batch) { DBG("%d: cbufs[0]=%p, zsbuf=%p", ctx->batch->needs_flush, - framebuffer->cbufs[0], framebuffer->zsbuf); + framebuffer->cbufs[0].texture, framebuffer->zsbuf.texture); fd_batch_flush(ctx->batch); } diff --git a/src/gallium/drivers/freedreno/freedreno_surface.c b/src/gallium/drivers/freedreno/freedreno_surface.c index efa24ac48da..060333a8ebd 100644 --- a/src/gallium/drivers/freedreno/freedreno_surface.c +++ b/src/gallium/drivers/freedreno/freedreno_surface.c @@ -17,12 +17,11 @@ struct pipe_surface * fd_create_surface(struct pipe_context *pctx, struct pipe_resource *ptex, const struct pipe_surface *surf_tmpl) { - struct fd_surface *surface = CALLOC_STRUCT(fd_surface); + struct pipe_surface *psurf = CALLOC_STRUCT(pipe_surface); - if (!surface) + if (!psurf) return NULL; - struct pipe_surface *psurf = &surface->base; unsigned level = surf_tmpl->u.tex.level; pipe_reference_init(&psurf->reference, 1); @@ -41,7 +40,7 @@ fd_create_surface(struct pipe_context *pctx, struct pipe_resource *ptex, psurf->u.tex.last_layer = surf_tmpl->u.tex.last_layer; } - return &surface->base; + return psurf; } void diff --git a/src/gallium/drivers/freedreno/freedreno_surface.h b/src/gallium/drivers/freedreno/freedreno_surface.h index dbe8d7b0400..81cf9c1a1db 100644 --- a/src/gallium/drivers/freedreno/freedreno_surface.h +++ b/src/gallium/drivers/freedreno/freedreno_surface.h @@ -11,16 +11,6 @@ #include "pipe/p_state.h" -struct fd_surface { - struct pipe_surface base; -}; - -static inline struct fd_surface * -fd_surface(struct pipe_surface *psurf) -{ - return (struct fd_surface *)psurf; -} - struct pipe_surface *fd_create_surface(struct pipe_context *pctx, struct pipe_resource *ptex, const struct pipe_surface *surf_tmpl); diff --git a/src/gallium/drivers/freedreno/freedreno_util.h b/src/gallium/drivers/freedreno/freedreno_util.h index 543e4dd7c5d..51ae73ca126 100644 --- a/src/gallium/drivers/freedreno/freedreno_util.h +++ b/src/gallium/drivers/freedreno/freedreno_util.h @@ -307,7 +307,7 @@ fd_half_precision(struct pipe_framebuffer_state *pfb) unsigned i; for (i = 0; i < pfb->nr_cbufs; i++) - if (!fd_surface_half_precision(pfb->cbufs[i])) + if (!fd_surface_half_precision(&pfb->cbufs[i])) return false; return true; diff --git a/src/gallium/drivers/i915/i915_clear.c b/src/gallium/drivers/i915/i915_clear.c index 4fb0a0a1be7..6e46a8acc66 100644 --- a/src/gallium/drivers/i915/i915_clear.c +++ b/src/gallium/drivers/i915/i915_clear.c @@ -57,7 +57,7 @@ i915_clear_emit(struct pipe_context *pipe, unsigned buffers, depth_clear_bbp = color_clear_bbp = 0; if (buffers & PIPE_CLEAR_COLOR) { - struct pipe_surface *cbuf = i915->framebuffer.cbufs[0]; + struct pipe_surface *cbuf = &i915->framebuffer.cbufs[0]; clear_params |= CLEARPARAM_WRITE_COLOR; cbuf_tex = i915_texture(cbuf->texture); @@ -82,7 +82,7 @@ i915_clear_emit(struct pipe_context *pipe, unsigned buffers, clear_depth = clear_stencil = 0; if (buffers & PIPE_CLEAR_DEPTH) { - struct pipe_surface *zbuf = i915->framebuffer.zsbuf; + struct pipe_surface *zbuf = &i915->framebuffer.zsbuf; clear_params |= CLEARPARAM_WRITE_DEPTH; depth_tex = i915_texture(zbuf->texture); @@ -104,7 +104,7 @@ i915_clear_emit(struct pipe_context *pipe, unsigned buffers, depth_clear_bbp = 16; } } else if (buffers & PIPE_CLEAR_STENCIL) { - struct pipe_surface *zbuf = i915->framebuffer.zsbuf; + struct pipe_surface *zbuf = &i915->framebuffer.zsbuf; clear_params |= CLEARPARAM_WRITE_STENCIL; depth_tex = i915_texture(zbuf->texture); @@ -228,9 +228,9 @@ i915_clear_blitter(struct pipe_context *pipe, unsigned buffers, for (i = 0; i < framebuffer->nr_cbufs; i++) { if (buffers & (PIPE_CLEAR_COLOR0 << i)) { - struct pipe_surface *ps = framebuffer->cbufs[i]; + struct pipe_surface *ps = &framebuffer->cbufs[i]; - if (ps) { + if (ps->texture) { uint16_t width, height; pipe_surface_size(ps, &width, &height); pipe->clear_render_target(pipe, ps, color, 0, 0, width, @@ -240,7 +240,7 @@ i915_clear_blitter(struct pipe_context *pipe, unsigned buffers, } if (buffers & PIPE_CLEAR_DEPTHSTENCIL) { - struct pipe_surface *ps = framebuffer->zsbuf; + struct pipe_surface *ps = &framebuffer->zsbuf; uint16_t width, height; pipe_surface_size(ps, &width, &height); pipe->clear_depth_stencil(pipe, ps, buffers & PIPE_CLEAR_DEPTHSTENCIL, diff --git a/src/gallium/drivers/i915/i915_context.c b/src/gallium/drivers/i915/i915_context.c index c45bd70216d..67d9b4d3f65 100644 --- a/src/gallium/drivers/i915/i915_context.c +++ b/src/gallium/drivers/i915/i915_context.c @@ -152,6 +152,7 @@ i915_destroy(struct pipe_context *pipe) i915->iws->batchbuffer_destroy(i915->batch); /* unbind framebuffer */ + util_framebuffer_init(pipe, NULL, i915->fb_cbufs, &i915->fb_zsbuf); util_unreference_framebuffer_state(&i915->framebuffer); /* unbind constant buffers */ diff --git a/src/gallium/drivers/i915/i915_context.h b/src/gallium/drivers/i915/i915_context.h index b0a7b7330ab..792481c5aab 100644 --- a/src/gallium/drivers/i915/i915_context.h +++ b/src/gallium/drivers/i915/i915_context.h @@ -40,6 +40,7 @@ #include "util/log.h" #include "util/slab.h" #include "util/u_blitter.h" +#include "util/u_framebuffer.h" #include "i915_reg.h" struct i915_winsys; @@ -278,6 +279,7 @@ struct i915_context { struct pipe_stencil_ref stencil_ref; struct pipe_clip_state clip; struct pipe_resource *constants[PIPE_SHADER_TYPES]; + PIPE_FB_SURFACES; //STOP USING THIS struct pipe_framebuffer_state framebuffer; struct pipe_poly_stipple poly_stipple; struct pipe_scissor_state scissor; diff --git a/src/gallium/drivers/i915/i915_state.c b/src/gallium/drivers/i915/i915_state.c index c2628d39bae..46ac0a4b261 100644 --- a/src/gallium/drivers/i915/i915_state.c +++ b/src/gallium/drivers/i915/i915_state.c @@ -867,9 +867,10 @@ i915_set_framebuffer_state(struct pipe_context *pipe, { struct i915_context *i915 = i915_context(pipe); + util_framebuffer_init(pipe, fb, i915->fb_cbufs, &i915->fb_zsbuf); util_copy_framebuffer_state(&i915->framebuffer, fb); if (fb->nr_cbufs) { - struct i915_surface *surf = i915_surface(i915->framebuffer.cbufs[0]); + struct i915_surface *surf = i915_surface(i915->fb_cbufs[0]); if (i915->current.fixup_swizzle != surf->oc_swizzle) { i915->current.fixup_swizzle = surf->oc_swizzle; memcpy(i915->current.color_swizzle, surf->color_swizzle, @@ -877,8 +878,8 @@ i915_set_framebuffer_state(struct pipe_context *pipe, i915->dirty |= I915_NEW_COLOR_SWIZZLE; } } - if (fb->zsbuf) - draw_set_zs_format(i915->draw, fb->zsbuf->format); + if (fb->zsbuf.texture) + draw_set_zs_format(i915->draw, fb->zsbuf.format); i915->dirty |= I915_NEW_FRAMEBUFFER; } diff --git a/src/gallium/drivers/i915/i915_state_dynamic.c b/src/gallium/drivers/i915/i915_state_dynamic.c index 875df7bbb63..daca2c8de3f 100644 --- a/src/gallium/drivers/i915/i915_state_dynamic.c +++ b/src/gallium/drivers/i915/i915_state_dynamic.c @@ -164,7 +164,7 @@ upload_IAB(struct i915_context *i915) unsigned iab = 0; if (i915->blend) { - struct i915_surface *cbuf = i915_surface(i915->framebuffer.cbufs[0]); + struct i915_surface *cbuf = i915_surface(i915->fb_cbufs[0]); if (cbuf && cbuf->alpha_in_g) iab |= i915->blend->iab_alpha_in_g; else if (cbuf && cbuf->alpha_is_x) diff --git a/src/gallium/drivers/i915/i915_state_emit.c b/src/gallium/drivers/i915/i915_state_emit.c index c19717cb7b7..6430707af8b 100644 --- a/src/gallium/drivers/i915/i915_state_emit.c +++ b/src/gallium/drivers/i915/i915_state_emit.c @@ -112,7 +112,7 @@ validate_immediate(struct i915_context *i915, unsigned *batch_space) static void emit_immediate_s5(struct i915_context *i915, uint32_t imm) { - struct i915_surface *surf = i915_surface(i915->framebuffer.cbufs[0]); + struct i915_surface *surf = i915_surface(i915->fb_cbufs[0]); if (surf) { uint32_t writemask = imm & S5_WRITEDISABLE_MASK; diff --git a/src/gallium/drivers/i915/i915_state_immediate.c b/src/gallium/drivers/i915/i915_state_immediate.c index 2972944a077..1322c0ff001 100644 --- a/src/gallium/drivers/i915/i915_state_immediate.c +++ b/src/gallium/drivers/i915/i915_state_immediate.c @@ -153,13 +153,13 @@ upload_S6(struct i915_context *i915) /* I915_NEW_FRAMEBUFFER */ - if (i915->framebuffer.cbufs[0]) + if (i915->framebuffer.cbufs[0].texture) LIS6 |= S6_COLOR_WRITE_ENABLE; /* I915_NEW_BLEND */ if (i915->blend) { - struct i915_surface *cbuf = i915_surface(i915->framebuffer.cbufs[0]); + struct i915_surface *cbuf = i915_surface(i915->fb_cbufs[0]); if (cbuf && cbuf->alpha_in_g) LIS6 |= i915->blend->LIS6_alpha_in_g; else if (cbuf && cbuf->alpha_is_x) diff --git a/src/gallium/drivers/i915/i915_state_static.c b/src/gallium/drivers/i915/i915_state_static.c index de4f7eb56ac..fa9476b3541 100644 --- a/src/gallium/drivers/i915/i915_state_static.c +++ b/src/gallium/drivers/i915/i915_state_static.c @@ -78,8 +78,8 @@ translate_depth_format(enum pipe_format zformat) static void update_framebuffer(struct i915_context *i915) { - struct pipe_surface *cbuf_surface = i915->framebuffer.cbufs[0]; - struct pipe_surface *depth_surface = i915->framebuffer.zsbuf; + struct pipe_surface *cbuf_surface = i915->fb_cbufs[0]; + struct pipe_surface *depth_surface = i915->fb_zsbuf; unsigned x, y; unsigned y1; int layer; @@ -154,8 +154,8 @@ struct i915_tracked_state i915_hw_framebuffer = { static void update_dst_buf_vars(struct i915_context *i915) { - struct pipe_surface *cbuf_surface = i915->framebuffer.cbufs[0]; - struct pipe_surface *depth_surface = i915->framebuffer.zsbuf; + struct pipe_surface *cbuf_surface = i915->fb_cbufs[0]; + struct pipe_surface *depth_surface = i915->fb_zsbuf; uint32_t dst_buf_vars, cformat, zformat; uint32_t early_z = 0; diff --git a/src/gallium/drivers/i915/i915_surface.c b/src/gallium/drivers/i915/i915_surface.c index 6e4fb3ad904..e528ab064b6 100644 --- a/src/gallium/drivers/i915/i915_surface.c +++ b/src/gallium/drivers/i915/i915_surface.c @@ -136,15 +136,14 @@ i915_clear_render_target_render(struct pipe_context *pipe, unsigned height, bool render_condition_enabled) { struct i915_context *i915 = i915_context(pipe); - struct pipe_framebuffer_state fb_state; + struct pipe_framebuffer_state fb_state = {0}; util_blitter_save_framebuffer(i915->blitter, &i915->framebuffer); fb_state.width = width; fb_state.height = height; fb_state.nr_cbufs = 1; - fb_state.cbufs[0] = dst; - fb_state.zsbuf = NULL; + fb_state.cbufs[0] = *dst; pipe->set_framebuffer_state(pipe, &fb_state); if (i915->dirty) @@ -173,7 +172,7 @@ i915_clear_depth_stencil_render(struct pipe_context *pipe, fb_state.width = width; fb_state.height = height; fb_state.nr_cbufs = 0; - fb_state.zsbuf = dst; + fb_state.zsbuf = *dst; pipe->set_framebuffer_state(pipe, &fb_state); if (i915->dirty) diff --git a/src/gallium/drivers/iris/iris_clear.c b/src/gallium/drivers/iris/iris_clear.c index 7e9d5762dd1..fb394b4fb37 100644 --- a/src/gallium/drivers/iris/iris_clear.c +++ b/src/gallium/drivers/iris/iris_clear.c @@ -743,7 +743,7 @@ iris_clear(struct pipe_context *ctx, } if (buffers & PIPE_CLEAR_DEPTHSTENCIL) { - struct pipe_surface *psurf = cso_fb->zsbuf; + struct pipe_surface *psurf = &cso_fb->zsbuf; box.depth = psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1; box.z = psurf->u.tex.first_layer, @@ -756,7 +756,7 @@ iris_clear(struct pipe_context *ctx, if (buffers & PIPE_CLEAR_COLOR) { for (unsigned i = 0; i < cso_fb->nr_cbufs; i++) { if (buffers & (PIPE_CLEAR_COLOR0 << i)) { - struct pipe_surface *psurf = cso_fb->cbufs[i]; + struct pipe_surface *psurf = ice->state.fb_cbufs[i]; struct iris_surface *isurf = (void *) psurf; box.depth = psurf->u.tex.last_layer - psurf->u.tex.first_layer + 1, box.z = psurf->u.tex.first_layer, diff --git a/src/gallium/drivers/iris/iris_context.c b/src/gallium/drivers/iris/iris_context.c index 65cf8a1edd5..5c25d5e60e9 100644 --- a/src/gallium/drivers/iris/iris_context.c +++ b/src/gallium/drivers/iris/iris_context.c @@ -229,6 +229,9 @@ iris_destroy_context(struct pipe_context *ctx) screen->vtbl.destroy_state(ice); + util_framebuffer_init(ctx, NULL, ice->state.fb_cbufs, &ice->state.fb_zsbuf); + util_unreference_framebuffer_state(&ice->state.framebuffer); + for (unsigned i = 0; i < ARRAY_SIZE(ice->shaders.scratch_surfs); i++) pipe_resource_reference(&ice->shaders.scratch_surfs[i].res, NULL); diff --git a/src/gallium/drivers/iris/iris_context.h b/src/gallium/drivers/iris/iris_context.h index a8d0e7bb63c..a3e233fa03f 100644 --- a/src/gallium/drivers/iris/iris_context.h +++ b/src/gallium/drivers/iris/iris_context.h @@ -30,6 +30,7 @@ #include "util/slab.h" #include "util/u_debug.h" #include "util/macros.h" +#include "util/u_framebuffer.h" #include "util/u_threaded_context.h" #include "intel/blorp/blorp.h" #include "intel/dev/intel_debug.h" @@ -1008,6 +1009,7 @@ struct iris_context { struct pipe_viewport_state viewports[IRIS_MAX_VIEWPORTS]; struct pipe_scissor_state scissors[IRIS_MAX_VIEWPORTS]; struct pipe_stencil_ref stencil_ref; + PIPE_FB_SURFACES; //STOP USING THIS struct pipe_framebuffer_state framebuffer; struct pipe_clip_state clip_planes; /* width and height treated like x2 and y2 */ diff --git a/src/gallium/drivers/iris/iris_resolve.c b/src/gallium/drivers/iris/iris_resolve.c index e5ea8831a90..81b226f404d 100644 --- a/src/gallium/drivers/iris/iris_resolve.c +++ b/src/gallium/drivers/iris/iris_resolve.c @@ -58,7 +58,7 @@ disable_rb_aux_buffer(struct iris_context *ice, return false; for (unsigned i = 0; i < cso_fb->nr_cbufs; i++) { - struct iris_surface *surf = (void *) cso_fb->cbufs[i]; + struct iris_surface *surf = (void *) ice->state.fb_cbufs[i]; if (!surf) continue; @@ -204,7 +204,7 @@ iris_predraw_resolve_framebuffer(struct iris_context *ice, const nir_shader *nir = ish->nir; if (ice->state.dirty & IRIS_DIRTY_DEPTH_BUFFER) { - struct pipe_surface *zs_surf = cso_fb->zsbuf; + struct pipe_surface *zs_surf = &cso_fb->zsbuf; if (zs_surf) { struct iris_resource *z_res, *s_res; @@ -230,9 +230,9 @@ iris_predraw_resolve_framebuffer(struct iris_context *ice, if (devinfo->ver == 8 && nir->info.outputs_read != 0) { for (unsigned i = 0; i < cso_fb->nr_cbufs; i++) { - if (cso_fb->cbufs[i]) { - struct iris_surface *surf = (void *) cso_fb->cbufs[i]; - struct iris_resource *res = (void *) cso_fb->cbufs[i]->texture; + if (cso_fb->cbufs[i].texture) { + struct iris_surface *surf = (void *) ice->state.fb_cbufs[i]; + struct iris_resource *res = (void *) cso_fb->cbufs[i].texture; iris_resource_prepare_texture(ice, res, surf->view.format, surf->view.base_level, 1, @@ -244,7 +244,7 @@ iris_predraw_resolve_framebuffer(struct iris_context *ice, if (ice->state.stage_dirty & IRIS_STAGE_DIRTY_BINDINGS_FS) { for (unsigned i = 0; i < cso_fb->nr_cbufs; i++) { - struct iris_surface *surf = (void *) cso_fb->cbufs[i]; + struct iris_surface *surf = (void *) ice->state.fb_cbufs[i]; if (!surf) continue; @@ -344,7 +344,7 @@ iris_postdraw_update_resolve_tracking(struct iris_context *ice) ice->state.dirty & (IRIS_DIRTY_DEPTH_BUFFER | IRIS_DIRTY_WM_DEPTH_STENCIL); - struct pipe_surface *zs_surf = cso_fb->zsbuf; + struct pipe_surface *zs_surf = &cso_fb->zsbuf; if (zs_surf) { struct iris_resource *z_res, *s_res; iris_get_depth_stencil_resources(zs_surf->texture, &z_res, &s_res); @@ -372,7 +372,7 @@ iris_postdraw_update_resolve_tracking(struct iris_context *ice) ice->state.stage_dirty & IRIS_STAGE_DIRTY_BINDINGS_FS; for (unsigned i = 0; i < cso_fb->nr_cbufs; i++) { - struct iris_surface *surf = (void *) cso_fb->cbufs[i]; + struct iris_surface *surf = (void *) ice->state.fb_cbufs[i]; if (!surf) continue; diff --git a/src/gallium/drivers/iris/iris_state.c b/src/gallium/drivers/iris/iris_state.c index 8f819e81e9a..6774e048188 100644 --- a/src/gallium/drivers/iris/iris_state.c +++ b/src/gallium/drivers/iris/iris_state.c @@ -2108,17 +2108,17 @@ want_pma_fix(struct iris_context *ice) * meaning the PMA signal will already be disabled). */ - if (!cso_fb->zsbuf) + if (!cso_fb->zsbuf.texture) return false; struct iris_resource *zres, *sres; - iris_get_depth_stencil_resources(cso_fb->zsbuf->texture, &zres, &sres); + iris_get_depth_stencil_resources(cso_fb->zsbuf.texture, &zres, &sres); /* 3DSTATE_DEPTH_BUFFER::SURFACE_TYPE != NULL && * 3DSTATE_DEPTH_BUFFER::HIZ Enable && */ if (!zres || - !iris_resource_level_has_hiz(devinfo, zres, cso_fb->zsbuf->u.tex.level)) + !iris_resource_level_has_hiz(devinfo, zres, cso_fb->zsbuf.u.tex.level)) return false; /* 3DSTATE_WM::EDSC_Mode != EDSC_PREPS */ @@ -3806,8 +3806,8 @@ iris_set_framebuffer_state(struct pipe_context *ctx, ice->state.dirty |= IRIS_DIRTY_CLIP; } - if (state->nr_cbufs > 0 && state->cbufs[0]) - new_res = (struct iris_resource *)state->cbufs[0]->texture; + if (state->nr_cbufs > 0) + new_res = (struct iris_resource *)state->cbufs[0].texture; if (new_res && new_res->use_damage) { new_render_area = new_res->damage; @@ -3825,15 +3825,15 @@ iris_set_framebuffer_state(struct pipe_context *ctx, ice->state.render_area = new_render_area; } - if (cso->zsbuf || state->zsbuf) { + if (cso->zsbuf.texture || state->zsbuf.texture) { ice->state.dirty |= IRIS_DIRTY_DEPTH_BUFFER; } bool has_integer_rt = false; for (unsigned i = 0; i < state->nr_cbufs; i++) { - if (state->cbufs[i]) { + if (state->cbufs[i].texture) { enum isl_format ifmt = - isl_format_for_pipe_format(state->cbufs[i]->format); + isl_format_for_pipe_format(state->cbufs[i].format); has_integer_rt |= isl_format_has_int_channel(ifmt); } } @@ -3844,6 +3844,7 @@ iris_set_framebuffer_state(struct pipe_context *ctx, ice->state.dirty |= IRIS_DIRTY_RASTER; } + util_framebuffer_init(ctx, state, ice->state.fb_cbufs, &ice->state.fb_zsbuf); util_copy_framebuffer_state(cso, state); cso->samples = samples; cso->layers = layers; @@ -3865,14 +3866,14 @@ iris_set_framebuffer_state(struct pipe_context *ctx, .mocs = iris_mocs(NULL, isl_dev, ISL_SURF_USAGE_DEPTH_BIT), }; - if (cso->zsbuf) { - iris_get_depth_stencil_resources(cso->zsbuf->texture, &zres, + if (cso->zsbuf.texture) { + iris_get_depth_stencil_resources(cso->zsbuf.texture, &zres, &stencil_res); - view.base_level = cso->zsbuf->u.tex.level; - view.base_array_layer = cso->zsbuf->u.tex.first_layer; + view.base_level = cso->zsbuf.u.tex.level; + view.base_array_layer = cso->zsbuf.u.tex.first_layer; view.array_len = - cso->zsbuf->u.tex.last_layer - cso->zsbuf->u.tex.first_layer + 1; + cso->zsbuf.u.tex.last_layer - cso->zsbuf.u.tex.first_layer + 1; if (zres) { view.usage |= ISL_SURF_USAGE_DEPTH_BIT; @@ -5811,8 +5812,8 @@ iris_populate_binding_table(struct iris_context *ice, if (cso_fb->nr_cbufs) { for (unsigned i = 0; i < cso_fb->nr_cbufs; i++) { uint32_t addr; - if (cso_fb->cbufs[i]) { - addr = use_surface(ice, batch, cso_fb->cbufs[i], true, + if (cso_fb->cbufs[i].texture) { + addr = use_surface(ice, batch, ice->state.fb_cbufs[i], true, ice->state.draw_aux_usage[i], false, IRIS_DOMAIN_RENDER_WRITE); } else { @@ -5835,8 +5836,8 @@ iris_populate_binding_table(struct iris_context *ice, foreach_surface_used(i, IRIS_SURFACE_GROUP_RENDER_TARGET_READ) { struct pipe_framebuffer_state *cso_fb = &ice->state.framebuffer; uint32_t addr; - if (cso_fb->cbufs[i]) { - addr = use_surface(ice, batch, cso_fb->cbufs[i], + if (cso_fb->cbufs[i].texture) { + addr = use_surface(ice, batch, ice->state.fb_cbufs[i], false, ice->state.draw_aux_usage[i], true, IRIS_DOMAIN_SAMPLER_READ); push_bt_entry(addr); @@ -5897,14 +5898,14 @@ iris_use_optional_res(struct iris_batch *batch, static void pin_depth_and_stencil_buffers(struct iris_batch *batch, - struct pipe_surface *zsbuf, + struct pipe_resource *zsbuf, struct iris_depth_stencil_alpha_state *cso_zsa) { if (!zsbuf) return; struct iris_resource *zres, *sres; - iris_get_depth_stencil_resources(zsbuf->texture, &zres, &sres); + iris_get_depth_stencil_resources(zsbuf, &zres, &sres); if (zres) { iris_use_pinned_bo(batch, zres->bo, cso_zsa->depth_writes_enabled, @@ -6078,7 +6079,7 @@ iris_restore_render_saved_bos(struct iris_context *ice, if ((clean & IRIS_DIRTY_DEPTH_BUFFER) && (clean & IRIS_DIRTY_WM_DEPTH_STENCIL)) { struct pipe_framebuffer_state *cso_fb = &ice->state.framebuffer; - pin_depth_and_stencil_buffers(batch, cso_fb->zsbuf, ice->state.cso_zsa); + pin_depth_and_stencil_buffers(batch, cso_fb->zsbuf.texture, ice->state.cso_zsa); } iris_use_optional_res(batch, ice->state.last_res.index_buffer, false, @@ -6683,7 +6684,7 @@ calculate_tile_dimensions(struct iris_context *ice, return false; for (unsigned i = 0; i < cso->nr_cbufs; i++) { - const struct iris_surface *surf = (void *)cso->cbufs[i]; + const struct iris_surface *surf = (void *)ice->state.fb_cbufs[i]; if (surf) { const struct iris_resource *res = (void *)surf->base.texture; @@ -6704,10 +6705,10 @@ calculate_tile_dimensions(struct iris_context *ice, } } - if (cso->zsbuf) { + if (cso->zsbuf.texture) { struct iris_resource *zres; struct iris_resource *sres; - iris_get_depth_stencil_resources(cso->zsbuf->texture, &zres, &sres); + iris_get_depth_stencil_resources(cso->zsbuf.texture, &zres, &sres); if (zres) { pixel_size += intel_calculate_surface_pixel_size(&zres->surf); @@ -6715,7 +6716,7 @@ calculate_tile_dimensions(struct iris_context *ice, /* XXX - Pessimistic, in some cases it might be helpful to neglect * aux surface traffic. */ - if (iris_resource_level_has_hiz(devinfo, zres, cso->zsbuf->u.tex.level)) { + if (iris_resource_level_has_hiz(devinfo, zres, cso->zsbuf.u.tex.level)) { pixel_size += intel_calculate_surface_pixel_size(&zres->aux.surf); if (isl_aux_usage_has_ccs(zres->aux.usage)) { @@ -7930,8 +7931,8 @@ iris_upload_dirty_render_state(struct iris_context *ice, /* Do not emit the cso yet. We may need to update clear params first. */ struct pipe_framebuffer_state *cso_fb = &ice->state.framebuffer; struct iris_resource *zres = NULL, *sres = NULL; - if (cso_fb->zsbuf) { - iris_get_depth_stencil_resources(cso_fb->zsbuf->texture, + if (cso_fb->zsbuf.texture) { + iris_get_depth_stencil_resources(cso_fb->zsbuf.texture, &zres, &sres); } @@ -7976,7 +7977,7 @@ iris_upload_dirty_render_state(struct iris_context *ice, if (dirty & (IRIS_DIRTY_DEPTH_BUFFER | IRIS_DIRTY_WM_DEPTH_STENCIL)) { /* Listen for buffer changes, and also write enable changes. */ struct pipe_framebuffer_state *cso_fb = &ice->state.framebuffer; - pin_depth_and_stencil_buffers(batch, cso_fb->zsbuf, ice->state.cso_zsa); + pin_depth_and_stencil_buffers(batch, cso_fb->zsbuf.texture, ice->state.cso_zsa); } if (dirty & IRIS_DIRTY_POLYGON_STIPPLE) { diff --git a/src/gallium/drivers/lima/lima_context.c b/src/gallium/drivers/lima/lima_context.c index 802f308f48e..7164d4cf8d1 100644 --- a/src/gallium/drivers/lima/lima_context.c +++ b/src/gallium/drivers/lima/lima_context.c @@ -147,6 +147,7 @@ lima_context_destroy(struct pipe_context *pctx) lima_program_fini(ctx); lima_state_fini(ctx); + util_framebuffer_init(pctx, NULL, ctx->framebuffer.fb_cbufs, &ctx->framebuffer.fb_zsbuf); util_unreference_framebuffer_state(&ctx->framebuffer.base); if (ctx->blitter) diff --git a/src/gallium/drivers/lima/lima_context.h b/src/gallium/drivers/lima/lima_context.h index cd753660623..14638a034d5 100644 --- a/src/gallium/drivers/lima/lima_context.h +++ b/src/gallium/drivers/lima/lima_context.h @@ -31,9 +31,11 @@ #include "pipe/p_context.h" #include "pipe/p_state.h" +#include "util/u_framebuffer.h" struct lima_context_framebuffer { struct pipe_framebuffer_state base; + PIPE_FB_SURFACES; //STOP USING THIS int tiled_w, tiled_h; int shift_w, shift_h; int block_w, block_h; diff --git a/src/gallium/drivers/lima/lima_draw.c b/src/gallium/drivers/lima/lima_draw.c index 3aac706980c..c12f2dbc6a0 100644 --- a/src/gallium/drivers/lima/lima_draw.c +++ b/src/gallium/drivers/lima/lima_draw.c @@ -128,16 +128,16 @@ lima_update_job_wb(struct lima_context *ctx, unsigned buffers) /* add to job when the buffer is dirty and resolve is clear (not added before) */ if (fb->base.nr_cbufs && (buffers & PIPE_CLEAR_COLOR0) && !(job->resolve & PIPE_CLEAR_COLOR0)) { - struct lima_resource *res = lima_resource(fb->base.cbufs[0]->texture); + struct lima_resource *res = lima_resource(fb->base.cbufs[0].texture); lima_flush_job_accessing_bo(ctx, res->bo, true); _mesa_hash_table_insert(ctx->write_jobs, &res->base, job); lima_job_add_bo(job, LIMA_PIPE_PP, res->bo, LIMA_SUBMIT_BO_WRITE); } /* add to job when the buffer is dirty and resolve is clear (not added before) */ - if (fb->base.zsbuf && (buffers & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) && + if (fb->base.zsbuf.texture && (buffers & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) && !(job->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))) { - struct lima_resource *res = lima_resource(fb->base.zsbuf->texture); + struct lima_resource *res = lima_resource(fb->base.zsbuf.texture); lima_flush_job_accessing_bo(ctx, res->bo, true); _mesa_hash_table_insert(ctx->write_jobs, &res->base, job); lima_job_add_bo(job, LIMA_PIPE_PP, res->bo, LIMA_SUBMIT_BO_WRITE); @@ -164,7 +164,7 @@ lima_clear(struct pipe_context *pctx, unsigned buffers, const struct pipe_scisso /* no need to reload if cleared */ if (ctx->framebuffer.base.nr_cbufs && (buffers & PIPE_CLEAR_COLOR0)) { - struct lima_surface *surf = lima_surface(ctx->framebuffer.base.cbufs[0]); + struct lima_surface *surf = lima_surface(ctx->framebuffer.fb_cbufs[0]); surf->reload &= ~PIPE_CLEAR_COLOR0; } @@ -185,7 +185,7 @@ lima_clear(struct pipe_context *pctx, unsigned buffers, const struct pipe_scisso float_to_ushort(color->f[0]); } - struct lima_surface *zsbuf = lima_surface(ctx->framebuffer.base.zsbuf); + struct lima_surface *zsbuf = lima_surface(ctx->framebuffer.fb_zsbuf); if (buffers & PIPE_CLEAR_DEPTH) { clear->depth = util_pack_z(PIPE_FORMAT_Z24X8_UNORM, depth); @@ -1020,7 +1020,7 @@ lima_draw_vbo_update(struct pipe_context *pctx, struct lima_context_framebuffer *fb = &ctx->framebuffer; unsigned buffers = 0; - if (fb->base.zsbuf) { + if (fb->base.zsbuf.texture) { if (ctx->zsa->base.depth_enabled) buffers |= PIPE_CLEAR_DEPTH; if (ctx->zsa->base.stencil[0].enabled || diff --git a/src/gallium/drivers/lima/lima_job.c b/src/gallium/drivers/lima/lima_job.c index 12af5e4cbb2..5084910f9c5 100644 --- a/src/gallium/drivers/lima/lima_job.c +++ b/src/gallium/drivers/lima/lima_job.c @@ -189,7 +189,7 @@ _lima_job_get(struct lima_context *ctx) { struct lima_context_framebuffer *fb = &ctx->framebuffer; - return lima_job_get_with_fb(ctx, fb->base.cbufs[0], fb->base.zsbuf); + return lima_job_get_with_fb(ctx, fb->fb_cbufs[0], fb->fb_zsbuf); } /* diff --git a/src/gallium/drivers/lima/lima_resource.c b/src/gallium/drivers/lima/lima_resource.c index 1de77e55560..8e06d7c2e8e 100644 --- a/src/gallium/drivers/lima/lima_resource.c +++ b/src/gallium/drivers/lima/lima_resource.c @@ -861,12 +861,17 @@ lima_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info) struct lima_context *ctx = lima_context(pctx); struct pipe_blit_info info = *blit_info; + /* For a discussion about flushes here see + * https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34054#note_2867478 + */ + lima_flush(ctx); + if (lima_do_blit(pctx, blit_info)) { - return; + goto done; } if (util_try_blit_via_copy_region(pctx, &info, false)) { - return; /* done */ + goto done; } if (info.mask & PIPE_MASK_S) { @@ -884,6 +889,9 @@ lima_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info) lima_util_blitter_save_states(ctx); util_blitter_blit(ctx->blitter, &info, NULL); + +done: + lima_flush(ctx); } static void diff --git a/src/gallium/drivers/lima/lima_state.c b/src/gallium/drivers/lima/lima_state.c index 165d0ba79f2..a84cedeb13b 100644 --- a/src/gallium/drivers/lima/lima_state.c +++ b/src/gallium/drivers/lima/lima_state.c @@ -50,6 +50,7 @@ lima_set_framebuffer_state(struct pipe_context *pctx, struct lima_context_framebuffer *fb = &ctx->framebuffer; + util_framebuffer_init(pctx, framebuffer, fb->fb_cbufs, &fb->fb_zsbuf); util_copy_framebuffer_state(&fb->base, framebuffer); ctx->job = NULL; diff --git a/src/gallium/drivers/llvmpipe/lp_flush.c b/src/gallium/drivers/llvmpipe/lp_flush.c index 0183fe9dede..425c9ddb769 100644 --- a/src/gallium/drivers/llvmpipe/lp_flush.c +++ b/src/gallium/drivers/llvmpipe/lp_flush.c @@ -76,12 +76,12 @@ llvmpipe_flush(struct pipe_context *pipe, for (i = 0; i < llvmpipe->framebuffer.nr_cbufs; i++) { snprintf(filename, sizeof(filename), "cbuf%u_%u", i, frame_no); - debug_dump_surface_bmp(&llvmpipe->pipe, filename, llvmpipe->framebuffer.cbufs[i]); + debug_dump_surface_bmp(&llvmpipe->pipe, filename, &llvmpipe->framebuffer.cbufs[i]); } if (0) { snprintf(filename, sizeof(filename), "zsbuf_%u", frame_no); - debug_dump_surface_bmp(&llvmpipe->pipe, filename, llvmpipe->framebuffer.zsbuf); + debug_dump_surface_bmp(&llvmpipe->pipe, filename, &llvmpipe->framebuffer.zsbuf); } ++frame_no; diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c index 6f0c1e10495..d8fc40f7d19 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast.c +++ b/src/gallium/drivers/llvmpipe/lp_rast.c @@ -115,13 +115,13 @@ lp_rast_tile_begin(struct lp_rasterizer_task *task, task->thread_data.ps_invocations = 0; for (unsigned i = 0; i < scene->fb.nr_cbufs; i++) { - if (scene->fb.cbufs[i]) { + if (scene->fb.cbufs[i].texture) { task->color_tiles[i] = scene->cbufs[i].map + scene->cbufs[i].stride * task->y + scene->cbufs[i].format_bytes * task->x; } } - if (scene->fb.zsbuf) { + if (scene->fb.zsbuf.texture) { task->depth_tile = scene->zsbuf.map + scene->zsbuf.stride * task->y + scene->zsbuf.format_bytes * task->x; @@ -143,9 +143,9 @@ lp_rast_clear_color(struct lp_rasterizer_task *task, /* we never bin clear commands for non-existing buffers */ assert(cbuf < scene->fb.nr_cbufs); - assert(scene->fb.cbufs[cbuf]); + assert(scene->fb.cbufs[cbuf].texture); - const enum pipe_format format = scene->fb.cbufs[cbuf]->format; + const enum pipe_format format = scene->fb.cbufs[cbuf].format; union util_color uc = arg.clear_rb->color_val; /* @@ -202,12 +202,12 @@ lp_rast_clear_zstencil(struct lp_rasterizer_task *task, * Clear the area of the depth/depth buffer matching this tile. */ - if (scene->fb.zsbuf) { + if (scene->fb.zsbuf.texture) { for (unsigned s = 0; s < scene->zsbuf.nr_samples; s++) { uint8_t *dst_layer = task->depth_tile + (s * scene->zsbuf.sample_stride); const unsigned block_size = - util_format_get_blocksize(scene->fb.zsbuf->format); + util_format_get_blocksize(scene->fb.zsbuf.format); clear_value &= clear_mask; @@ -326,7 +326,7 @@ lp_rast_shade_tile(struct lp_rasterizer_task *task, unsigned stride[PIPE_MAX_COLOR_BUFS]; unsigned sample_stride[PIPE_MAX_COLOR_BUFS]; for (unsigned i = 0; i < scene->fb.nr_cbufs; i++){ - if (scene->fb.cbufs[i]) { + if (scene->fb.cbufs[i].texture) { stride[i] = scene->cbufs[i].stride; sample_stride[i] = scene->cbufs[i].sample_stride; color[i] = lp_rast_get_color_block_pointer(task, i, tile_x + x, @@ -435,7 +435,7 @@ lp_rast_shade_quads_mask_sample(struct lp_rasterizer_task *task, unsigned sample_stride[PIPE_MAX_COLOR_BUFS]; unsigned view_index = inputs->view_index; for (unsigned i = 0; i < scene->fb.nr_cbufs; i++) { - if (scene->fb.cbufs[i]) { + if (scene->fb.cbufs[i].texture) { stride[i] = scene->cbufs[i].stride; sample_stride[i] = scene->cbufs[i].sample_stride; color[i] = lp_rast_get_color_block_pointer(task, i, x, y, @@ -516,7 +516,7 @@ lp_rast_blit_tile_to_dest(struct lp_rasterizer_task *task, const struct lp_rast_state *state = task->state; struct lp_fragment_shader_variant *variant = state->variant; const struct lp_jit_texture *texture = &state->jit_resources.textures[0]; - struct pipe_surface *cbuf = scene->fb.cbufs[0]; + const struct pipe_surface *cbuf = &scene->fb.cbufs[0]; const unsigned face_slice = cbuf->u.tex.first_layer; const unsigned level = cbuf->u.tex.level; struct llvmpipe_resource *lpt = llvmpipe_resource(cbuf->texture); diff --git a/src/gallium/drivers/llvmpipe/lp_rast_priv.h b/src/gallium/drivers/llvmpipe/lp_rast_priv.h index 390988c471b..c5b92fa8329 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast_priv.h +++ b/src/gallium/drivers/llvmpipe/lp_rast_priv.h @@ -183,7 +183,7 @@ lp_rast_get_color_block_pointer(struct lp_rasterizer_task *task, color += (layer + view_index) * task->scene->cbufs[buf].layer_stride; } - assert(lp_check_alignment(color, llvmpipe_get_format_alignment(task->scene->fb.cbufs[buf]->format))); + assert(lp_check_alignment(color, llvmpipe_get_format_alignment(task->scene->fb.cbufs[buf].format))); return color; } @@ -213,7 +213,7 @@ lp_rast_get_depth_block_pointer(struct lp_rasterizer_task *task, depth += (layer + view_index) * task->scene->zsbuf.layer_stride; } - assert(lp_check_alignment(depth, llvmpipe_get_format_alignment(task->scene->fb.zsbuf->format))); + assert(lp_check_alignment(depth, llvmpipe_get_format_alignment(task->scene->fb.zsbuf.format))); return depth; } @@ -241,7 +241,7 @@ lp_rast_shade_quads_all(struct lp_rasterizer_task *task, /* color buffer */ for (unsigned i = 0; i < scene->fb.nr_cbufs; i++) { - if (scene->fb.cbufs[i]) { + if (scene->fb.cbufs[i].texture) { stride[i] = scene->cbufs[i].stride; sample_stride[i] = scene->cbufs[i].sample_stride; color[i] = lp_rast_get_color_block_pointer(task, i, x, y, diff --git a/src/gallium/drivers/llvmpipe/lp_scene.c b/src/gallium/drivers/llvmpipe/lp_scene.c index aa8f93345fe..b26e334a74d 100644 --- a/src/gallium/drivers/llvmpipe/lp_scene.c +++ b/src/gallium/drivers/llvmpipe/lp_scene.c @@ -200,19 +200,15 @@ init_scene_texture(struct lp_scene_surface *ssurf, struct pipe_surface *psurf) void lp_scene_begin_rasterization(struct lp_scene *scene) { - const struct pipe_framebuffer_state *fb = &scene->fb; - //LP_DBG(DEBUG_RAST, "%s\n", __func__); for (unsigned i = 0; i < scene->fb.nr_cbufs; i++) { - struct pipe_surface *cbuf = scene->fb.cbufs[i]; - init_scene_texture(&scene->cbufs[i], cbuf); + struct pipe_surface *cbuf = &scene->fb.cbufs[i]; + init_scene_texture(&scene->cbufs[i], cbuf->texture ? cbuf : NULL); } - if (fb->zsbuf) { - struct pipe_surface *zsbuf = scene->fb.zsbuf; - init_scene_texture(&scene->zsbuf, zsbuf); - } + struct pipe_surface *zsbuf = &scene->fb.zsbuf; + init_scene_texture(&scene->zsbuf, zsbuf->texture ? zsbuf : NULL); } @@ -227,7 +223,7 @@ lp_scene_end_rasterization(struct lp_scene *scene) /* Unmap color buffers */ for (unsigned i = 0; i < scene->fb.nr_cbufs; i++) { if (scene->cbufs[i].map) { - struct pipe_surface *cbuf = scene->fb.cbufs[i]; + struct pipe_surface *cbuf = &scene->fb.cbufs[i]; if (llvmpipe_resource_is_texture(cbuf->texture)) { llvmpipe_resource_unmap(cbuf->texture, cbuf->u.tex.level, @@ -239,7 +235,7 @@ lp_scene_end_rasterization(struct lp_scene *scene) /* Unmap z/stencil buffer */ if (scene->zsbuf.map) { - struct pipe_surface *zsbuf = scene->fb.zsbuf; + struct pipe_surface *zsbuf = &scene->fb.zsbuf; llvmpipe_resource_unmap(zsbuf->texture, zsbuf->u.tex.level, zsbuf->u.tex.first_layer); @@ -527,10 +523,10 @@ lp_scene_is_resource_referenced(const struct lp_scene *scene, /* check the render targets */ for (unsigned j = 0; j < scene->fb.nr_cbufs; j++) { - if (scene->fb.cbufs[j] && scene->fb.cbufs[j]->texture == resource) + if (scene->fb.cbufs[j].texture == resource) return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE; } - if (scene->fb.zsbuf && scene->fb.zsbuf->texture == resource) { + if (scene->fb.zsbuf.texture == resource) { return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE; } @@ -638,8 +634,8 @@ lp_scene_begin_binning(struct lp_scene *scene, */ unsigned max_layer = ~0; for (unsigned i = 0; i < scene->fb.nr_cbufs; i++) { - struct pipe_surface *cbuf = scene->fb.cbufs[i]; - if (cbuf) { + struct pipe_surface *cbuf = &scene->fb.cbufs[i]; + if (cbuf->texture) { if (llvmpipe_resource_is_texture(cbuf->texture)) { max_layer = MIN2(max_layer, cbuf->u.tex.last_layer - cbuf->u.tex.first_layer); @@ -649,8 +645,8 @@ lp_scene_begin_binning(struct lp_scene *scene, } } - if (fb->zsbuf) { - struct pipe_surface *zsbuf = scene->fb.zsbuf; + if (fb->zsbuf.texture) { + struct pipe_surface *zsbuf = &scene->fb.zsbuf; max_layer = MIN2(max_layer, zsbuf->u.tex.last_layer - zsbuf->u.tex.first_layer); } diff --git a/src/gallium/drivers/llvmpipe/lp_setup.c b/src/gallium/drivers/llvmpipe/lp_setup.c index 76ea2c807e0..8c50109d915 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup.c +++ b/src/gallium/drivers/llvmpipe/lp_setup.c @@ -238,9 +238,9 @@ begin_binning(struct lp_setup_context *setup) } bool need_zsload = false; - if (setup->fb.zsbuf && + if (setup->fb.zsbuf.texture && ((setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) && - util_format_is_depth_and_stencil(setup->fb.zsbuf->format)) { + util_format_is_depth_and_stencil(setup->fb.zsbuf.format)) { need_zsload = true; } @@ -274,7 +274,7 @@ begin_binning(struct lp_setup_context *setup) } } - if (setup->fb.zsbuf) { + if (setup->fb.zsbuf.texture) { if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) { if (!lp_scene_bin_everywhere(scene, LP_RAST_OP_CLEAR_ZSTENCIL, @@ -426,7 +426,7 @@ lp_setup_try_clear_color_buffer(struct lp_setup_context *setup, { union lp_rast_cmd_arg clearrb_arg; union util_color uc; - const enum pipe_format format = setup->fb.cbufs[cbuf]->format; + const enum pipe_format format = setup->fb.cbufs[cbuf].format; LP_DBG(DEBUG_SETUP, "%s state %d\n", __func__, setup->state); @@ -483,7 +483,7 @@ lp_setup_try_clear_zs(struct lp_setup_context *setup, { LP_DBG(DEBUG_SETUP, "%s state %d\n", __func__, setup->state); - enum pipe_format format = setup->fb.zsbuf->format; + enum pipe_format format = setup->fb.zsbuf.format; const uint32_t zmask32 = (flags & PIPE_CLEAR_DEPTH) ? ~0 : 0; const uint8_t smask8 = (flags & PIPE_CLEAR_STENCIL) ? ~0 : 0; @@ -561,7 +561,7 @@ lp_setup_clear(struct lp_setup_context *setup, if (flags & PIPE_CLEAR_COLOR) { assert(PIPE_CLEAR_COLOR0 == (1 << 2)); for (unsigned i = 0; i < setup->fb.nr_cbufs; i++) { - if ((flags & (1 << (2 + i))) && setup->fb.cbufs[i]) { + if ((flags & (1 << (2 + i))) && setup->fb.cbufs[i].texture) { if (!lp_setup_try_clear_color_buffer(setup, color, i)) { set_scene_state(setup, SETUP_FLUSHED, __func__); @@ -951,10 +951,10 @@ lp_setup_is_resource_referenced(const struct lp_setup_context *setup, { /* check the render targets */ for (unsigned i = 0; i < setup->fb.nr_cbufs; i++) { - if (setup->fb.cbufs[i] && setup->fb.cbufs[i]->texture == texture) + if (setup->fb.cbufs[i].texture == texture) return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE; } - if (setup->fb.zsbuf && setup->fb.zsbuf->texture == texture) { + if (setup->fb.zsbuf.texture == texture) { return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE; } diff --git a/src/gallium/drivers/llvmpipe/lp_setup_rect.c b/src/gallium/drivers/llvmpipe/lp_setup_rect.c index b2a4d4b28b7..a792c2f5039 100644 --- a/src/gallium/drivers/llvmpipe/lp_setup_rect.c +++ b/src/gallium/drivers/llvmpipe/lp_setup_rect.c @@ -104,7 +104,7 @@ lp_setup_whole_tile(struct lp_setup_context *setup, * accurate query results we unfortunately need to execute the rendering * commands. */ - if (!scene->fb.zsbuf && scene->fb_max_layer == 0 && + if (!scene->fb.zsbuf.texture && scene->fb_max_layer == 0 && !scene->had_queries) { /* * All previous rendering will be overwritten so reset the bin. diff --git a/src/gallium/drivers/llvmpipe/lp_state_derived.c b/src/gallium/drivers/llvmpipe/lp_state_derived.c index 4735e714457..d52b7a9dbb0 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_derived.c +++ b/src/gallium/drivers/llvmpipe/lp_state_derived.c @@ -199,18 +199,18 @@ static void check_linear_rasterizer(struct llvmpipe_context *lp) { const bool valid_cb_format = - (lp->framebuffer.nr_cbufs == 1 && lp->framebuffer.cbufs[0] && - util_res_sample_count(lp->framebuffer.cbufs[0]->texture) == 1 && - lp->framebuffer.cbufs[0]->texture->target == PIPE_TEXTURE_2D && - (lp->framebuffer.cbufs[0]->format == PIPE_FORMAT_B8G8R8A8_UNORM || - lp->framebuffer.cbufs[0]->format == PIPE_FORMAT_B8G8R8X8_UNORM || - lp->framebuffer.cbufs[0]->format == PIPE_FORMAT_R8G8B8A8_UNORM || - lp->framebuffer.cbufs[0]->format == PIPE_FORMAT_R8G8B8X8_UNORM)); + (lp->framebuffer.nr_cbufs == 1 && lp->framebuffer.cbufs[0].texture && + util_res_sample_count(lp->framebuffer.cbufs[0].texture) == 1 && + lp->framebuffer.cbufs[0].texture->target == PIPE_TEXTURE_2D && + (lp->framebuffer.cbufs[0].format == PIPE_FORMAT_B8G8R8A8_UNORM || + lp->framebuffer.cbufs[0].format == PIPE_FORMAT_B8G8R8X8_UNORM || + lp->framebuffer.cbufs[0].format == PIPE_FORMAT_R8G8B8A8_UNORM || + lp->framebuffer.cbufs[0].format == PIPE_FORMAT_R8G8B8X8_UNORM)); /* permit_linear means guardband, hence fake scissor, which we can only * handle if there's just one vp. */ const bool single_vp = lp->viewport_index_slot < 0; - const bool permit_linear = (!lp->framebuffer.zsbuf && + const bool permit_linear = (!lp->framebuffer.zsbuf.texture && valid_cb_format && single_vp); diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c index d65694a0b3a..4bfccd83e17 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c @@ -4430,8 +4430,8 @@ make_variant_key(struct llvmpipe_context *lp, memset(key, 0, sizeof(*key)); - if (lp->framebuffer.zsbuf) { - const enum pipe_format zsbuf_format = lp->framebuffer.zsbuf->format; + if (lp->framebuffer.zsbuf.texture) { + const enum pipe_format zsbuf_format = lp->framebuffer.zsbuf.format; const struct util_format_description *zsbuf_desc = util_format_description(zsbuf_format); @@ -4448,11 +4448,11 @@ make_variant_key(struct llvmpipe_context *lp, memcpy(&key->stencil, &lp->depth_stencil->stencil, sizeof key->stencil); } - if (llvmpipe_resource_is_1d(lp->framebuffer.zsbuf->texture)) { + if (llvmpipe_resource_is_1d(lp->framebuffer.zsbuf.texture)) { key->resource_1d = true; } key->zsbuf_nr_samples = - util_res_sample_count(lp->framebuffer.zsbuf->texture); + util_res_sample_count(lp->framebuffer.zsbuf.texture); /* * Restrict depth values if the API is clamped (GL, VK with ext) @@ -4472,8 +4472,8 @@ make_variant_key(struct llvmpipe_context *lp, * (or does not exist) */ if (!lp->framebuffer.nr_cbufs || - !lp->framebuffer.cbufs[0] || - !util_format_is_pure_integer(lp->framebuffer.cbufs[0]->format)) { + !lp->framebuffer.cbufs[0].texture || + !util_format_is_pure_integer(lp->framebuffer.cbufs[0].format)) { key->alpha.enabled = lp->depth_stencil->alpha_enabled; } if (key->alpha.enabled) { @@ -4536,19 +4536,19 @@ make_variant_key(struct llvmpipe_context *lp, for (unsigned i = 0; i < lp->framebuffer.nr_cbufs; i++) { struct pipe_rt_blend_state *blend_rt = &key->blend.rt[i]; - if (lp->framebuffer.cbufs[i]) { - const enum pipe_format format = lp->framebuffer.cbufs[i]->format; + if (lp->framebuffer.cbufs[i].texture) { + const enum pipe_format format = lp->framebuffer.cbufs[i].format; key->cbuf_format[i] = format; key->cbuf_nr_samples[i] = - util_res_sample_count(lp->framebuffer.cbufs[i]->texture); + util_res_sample_count(lp->framebuffer.cbufs[i].texture); /* * Figure out if this is a 1d resource. Note that OpenGL allows crazy * mixing of 2d textures with height 1 and 1d textures, so make sure * we pick 1d if any cbuf or zsbuf is 1d. */ - if (llvmpipe_resource_is_1d(lp->framebuffer.cbufs[i]->texture)) { + if (llvmpipe_resource_is_1d(lp->framebuffer.cbufs[i].texture)) { key->resource_1d = true; } diff --git a/src/gallium/drivers/llvmpipe/lp_state_surface.c b/src/gallium/drivers/llvmpipe/lp_state_surface.c index a4ebcbc8390..f85dc5af98b 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_surface.c +++ b/src/gallium/drivers/llvmpipe/lp_state_surface.c @@ -61,27 +61,16 @@ llvmpipe_set_framebuffer_state(struct pipe_context *pipe, * If no depth buffer is bound, send the utility function the default * format for no bound depth (PIPE_FORMAT_NONE). */ - enum pipe_format depth_format = fb->zsbuf && !(LP_PERF & PERF_NO_DEPTH) ? - fb->zsbuf->format : PIPE_FORMAT_NONE; + enum pipe_format depth_format = fb->zsbuf.texture && !(LP_PERF & PERF_NO_DEPTH) ? + fb->zsbuf.format : PIPE_FORMAT_NONE; const struct util_format_description *depth_desc = util_format_description(depth_format); - if (fb->zsbuf && fb->zsbuf->context != pipe) { - debug_printf("Illegal setting of fb state with zsbuf created in " - "another context\n"); - } - for (unsigned i = 0; i < fb->nr_cbufs; i++) { - if (fb->cbufs[i] && - fb->cbufs[i]->context != pipe) { - debug_printf("Illegal setting of fb state with cbuf %d created in " - "another context\n", i); - } - } - util_copy_framebuffer_state(&lp->framebuffer, fb); if (LP_PERF & PERF_NO_DEPTH) { - pipe_surface_reference(&lp->framebuffer.zsbuf, NULL); + pipe_resource_reference(&lp->framebuffer.zsbuf.texture, NULL); + memset(&lp->framebuffer.zsbuf, 0, sizeof(lp->framebuffer.zsbuf)); } /* diff --git a/src/gallium/drivers/llvmpipe/lp_surface.c b/src/gallium/drivers/llvmpipe/lp_surface.c index 0fb74534c4c..bd8102d40d5 100644 --- a/src/gallium/drivers/llvmpipe/lp_surface.c +++ b/src/gallium/drivers/llvmpipe/lp_surface.c @@ -192,6 +192,10 @@ lp_blit(struct pipe_context *pipe, lp->render_cond_cond, lp->render_cond_mode); util_blitter_blit(lp->blitter, &info, NULL); + + /* not sure why this is needed but it is */ + if (llvmpipe_is_resource_referenced(pipe, blit_info->dst.resource, blit_info->dst.level) & LP_REFERENCED_FOR_WRITE) + lp_setup_bind_framebuffer(lp->setup, &lp->framebuffer); } diff --git a/src/gallium/drivers/nouveau/nouveau_video.c b/src/gallium/drivers/nouveau/nouveau_video.c index 077b5b53417..7106e5f4bc1 100644 --- a/src/gallium/drivers/nouveau/nouveau_video.c +++ b/src/gallium/drivers/nouveau/nouveau_video.c @@ -31,6 +31,7 @@ #include "util/u_video.h" #include "util/format/u_format.h" #include "util/u_sampler.h" +#include "util/u_surface.h" static int nouveau_vpe_init(struct nouveau_decoder *dec) { @@ -726,35 +727,21 @@ error: return NULL; } -static struct pipe_surface ** +static struct pipe_surface * nouveau_video_buffer_surfaces(struct pipe_video_buffer *buffer) { struct nouveau_video_buffer *buf = (struct nouveau_video_buffer *)buffer; struct pipe_surface surf_templ; - struct pipe_context *pipe; unsigned i; assert(buf); - pipe = buf->base.context; - for (i = 0; i < buf->num_planes; ++i ) { - if (!buf->surfaces[i]) { - memset(&surf_templ, 0, sizeof(surf_templ)); - surf_templ.format = buf->resources[i]->format; - buf->surfaces[i] = pipe->create_surface(pipe, buf->resources[i], &surf_templ); - if (!buf->surfaces[i]) - goto error; - } + u_surface_default_template(&surf_templ, buf->resources[i]); + buf->surfaces[i] = surf_templ; } return buf->surfaces; - -error: - for (i = 0; i < buf->num_planes; ++i ) - pipe_surface_reference(&buf->surfaces[i], NULL); - - return NULL; } static void @@ -766,7 +753,6 @@ nouveau_video_buffer_destroy(struct pipe_video_buffer *buffer) assert(buf); for (i = 0; i < buf->num_planes; ++i) { - pipe_surface_reference(&buf->surfaces[i], NULL); pipe_sampler_view_reference(&buf->sampler_view_planes[i], NULL); pipe_sampler_view_reference(&buf->sampler_view_components[i], NULL); pipe_resource_reference(&buf->resources[i], NULL); diff --git a/src/gallium/drivers/nouveau/nouveau_video.h b/src/gallium/drivers/nouveau/nouveau_video.h index bcbe4bb04c4..2db13c86ba7 100644 --- a/src/gallium/drivers/nouveau/nouveau_video.h +++ b/src/gallium/drivers/nouveau/nouveau_video.h @@ -13,7 +13,7 @@ struct nouveau_video_buffer { struct pipe_resource *resources[VL_NUM_COMPONENTS]; struct pipe_sampler_view *sampler_view_planes[VL_NUM_COMPONENTS]; struct pipe_sampler_view *sampler_view_components[VL_NUM_COMPONENTS]; - struct pipe_surface *surfaces[VL_NUM_COMPONENTS * 2]; + struct pipe_surface surfaces[VL_NUM_COMPONENTS * 2]; }; struct nouveau_decoder { diff --git a/src/gallium/drivers/nouveau/nouveau_vp3_video.c b/src/gallium/drivers/nouveau/nouveau_vp3_video.c index 5be369357cd..4abf417229e 100644 --- a/src/gallium/drivers/nouveau/nouveau_vp3_video.c +++ b/src/gallium/drivers/nouveau/nouveau_vp3_video.c @@ -35,6 +35,7 @@ #include "util/u_video.h" #include "util/format/u_format.h" #include "util/u_sampler.h" +#include "util/u_surface.h" static void nouveau_vp3_video_buffer_resources(struct pipe_video_buffer *buffer, @@ -64,7 +65,7 @@ nouveau_vp3_video_buffer_sampler_view_components(struct pipe_video_buffer *buffe return buf->sampler_view_components; } -static struct pipe_surface ** +static struct pipe_surface * nouveau_vp3_video_buffer_surfaces(struct pipe_video_buffer *buffer) { struct nouveau_vp3_video_buffer *buf = (struct nouveau_vp3_video_buffer *)buffer; @@ -83,8 +84,6 @@ nouveau_vp3_video_buffer_destroy(struct pipe_video_buffer *buffer) pipe_resource_reference(&buf->resources[i], NULL); pipe_sampler_view_reference(&buf->sampler_view_planes[i], NULL); pipe_sampler_view_reference(&buf->sampler_view_components[i], NULL); - pipe_surface_reference(&buf->surfaces[i * 2], NULL); - pipe_surface_reference(&buf->surfaces[i * 2 + 1], NULL); } FREE(buffer); } @@ -167,16 +166,12 @@ nouveau_vp3_video_buffer_create(struct pipe_context *pipe, memset(&surf_templ, 0, sizeof(surf_templ)); for (j = 0; j < buffer->num_planes; ++j) { - surf_templ.format = buffer->resources[j]->format; + u_surface_default_template(&surf_templ, buffer->resources[j]); surf_templ.u.tex.first_layer = surf_templ.u.tex.last_layer = 0; - buffer->surfaces[j * 2] = pipe->create_surface(pipe, buffer->resources[j], &surf_templ); - if (!buffer->surfaces[j * 2]) - goto error; + buffer->surfaces[j * 2] = surf_templ; surf_templ.u.tex.first_layer = surf_templ.u.tex.last_layer = 1; - buffer->surfaces[j * 2 + 1] = pipe->create_surface(pipe, buffer->resources[j], &surf_templ); - if (!buffer->surfaces[j * 2 + 1]) - goto error; + buffer->surfaces[j * 2 + 1] = surf_templ; } return &buffer->base; diff --git a/src/gallium/drivers/nouveau/nouveau_vp3_video.h b/src/gallium/drivers/nouveau/nouveau_vp3_video.h index 03d7cc3bb95..6c9aa27dc1c 100644 --- a/src/gallium/drivers/nouveau/nouveau_vp3_video.h +++ b/src/gallium/drivers/nouveau/nouveau_vp3_video.h @@ -32,7 +32,7 @@ struct nouveau_vp3_video_buffer { struct pipe_resource *resources[VL_NUM_COMPONENTS]; struct pipe_sampler_view *sampler_view_planes[VL_NUM_COMPONENTS]; struct pipe_sampler_view *sampler_view_components[VL_NUM_COMPONENTS]; - struct pipe_surface *surfaces[VL_NUM_COMPONENTS * 2]; + struct pipe_surface surfaces[VL_NUM_COMPONENTS * 2]; }; #define SLICE_SIZE 0x200 diff --git a/src/gallium/drivers/nouveau/nv30/nv30_clear.c b/src/gallium/drivers/nouveau/nv30/nv30_clear.c index 7122858b9d1..28ed69aa0ac 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_clear.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_clear.c @@ -79,15 +79,15 @@ nv30_clear(struct pipe_context *pipe, unsigned buffers, const struct pipe_scisso } if (buffers & PIPE_CLEAR_COLOR && fb->nr_cbufs) { - colr = pack_rgba(fb->cbufs[0]->format, color->f); + colr = pack_rgba(fb->cbufs[0].format, color->f); mode |= NV30_3D_CLEAR_BUFFERS_COLOR_R | NV30_3D_CLEAR_BUFFERS_COLOR_G | NV30_3D_CLEAR_BUFFERS_COLOR_B | NV30_3D_CLEAR_BUFFERS_COLOR_A; } - if (fb->zsbuf) { - zeta = pack_zeta(fb->zsbuf->format, depth, stencil); + if (fb->zsbuf.texture) { + zeta = pack_zeta(fb->zsbuf.format, depth, stencil); if (buffers & PIPE_CLEAR_DEPTH) mode |= NV30_3D_CLEAR_BUFFERS_DEPTH; if (buffers & PIPE_CLEAR_STENCIL) { diff --git a/src/gallium/drivers/nouveau/nv30/nv30_context.c b/src/gallium/drivers/nouveau/nv30/nv30_context.c index 7ce9f33a165..7a7b1abdece 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_context.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_context.c @@ -90,8 +90,7 @@ nv30_invalidate_resource_storage(struct nouveau_context *nv, if (res->bind & PIPE_BIND_RENDER_TARGET) { for (i = 0; i < nv30->framebuffer.nr_cbufs; ++i) { - if (nv30->framebuffer.cbufs[i] && - nv30->framebuffer.cbufs[i]->texture == res) { + if (nv30->framebuffer.cbufs[i].texture == res) { nv30->dirty |= NV30_NEW_FRAMEBUFFER; nouveau_bufctx_reset(nv30->bufctx, BUFCTX_FB); if (!--ref) @@ -100,8 +99,7 @@ nv30_invalidate_resource_storage(struct nouveau_context *nv, } } if (res->bind & PIPE_BIND_DEPTH_STENCIL) { - if (nv30->framebuffer.zsbuf && - nv30->framebuffer.zsbuf->texture == res) { + if (nv30->framebuffer.zsbuf.texture == res) { nv30->dirty |= NV30_NEW_FRAMEBUFFER; nouveau_bufctx_reset(nv30->bufctx, BUFCTX_FB); if (!--ref) @@ -164,6 +162,9 @@ nv30_context_destroy(struct pipe_context *pipe) if (nv30->blit_fp) pipe_resource_reference(&nv30->blit_fp, NULL); + util_framebuffer_init(pipe, NULL, nv30->fb_cbufs, &nv30->fb_zsbuf); + util_unreference_framebuffer_state(&nv30->framebuffer); + nouveau_bufctx_del(&nv30->bufctx); if (nv30->screen->cur_ctx == nv30) diff --git a/src/gallium/drivers/nouveau/nv30/nv30_context.h b/src/gallium/drivers/nouveau/nv30/nv30_context.h index 1b7dd4292a6..5ec05a0accd 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_context.h +++ b/src/gallium/drivers/nouveau/nv30/nv30_context.h @@ -3,6 +3,7 @@ #include "util/format/u_formats.h" #include "util/u_blitter.h" +#include "util/u_framebuffer.h" #include "nv30/nv30_screen.h" #include "nv30/nv30_state.h" @@ -98,6 +99,7 @@ struct nv30_context { unsigned dirty_samplers; } fragprog; + PIPE_FB_SURFACES; //STOP USING THIS struct pipe_framebuffer_state framebuffer; struct pipe_blend_color blend_colour; struct pipe_stencil_ref stencil_ref; diff --git a/src/gallium/drivers/nouveau/nv30/nv30_state.c b/src/gallium/drivers/nouveau/nv30/nv30_state.c index fd760b3f341..7d27f9e37ea 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_state.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_state.c @@ -379,25 +379,27 @@ nv30_set_framebuffer_state(struct pipe_context *pipe, nouveau_bufctx_reset(nv30->bufctx, BUFCTX_FB); - nv30->framebuffer = *fb; + util_copy_framebuffer_state(&nv30->framebuffer, fb); nv30->dirty |= NV30_NEW_FRAMEBUFFER; /* Hardware can't handle different swizzled-ness or different blocksizes * for zs and cbufs. If both are supplied and something doesn't match, * blank out the zs for now so that at least *some* rendering can occur. */ - if (fb->nr_cbufs > 0 && fb->zsbuf) { - struct nv30_miptree *color_mt = nv30_miptree(fb->cbufs[0]->texture); - struct nv30_miptree *zeta_mt = nv30_miptree(fb->zsbuf->texture); + if (fb->nr_cbufs > 0 && fb->zsbuf.texture) { + struct nv30_miptree *color_mt = nv30_miptree(fb->cbufs[0].texture); + struct nv30_miptree *zeta_mt = nv30_miptree(fb->zsbuf.texture); if (color_mt->swizzled != zeta_mt->swizzled || (color_mt->swizzled && - (util_format_get_blocksize(fb->zsbuf->format) > 2) != - (util_format_get_blocksize(fb->cbufs[0]->format) > 2))) { - nv30->framebuffer.zsbuf = NULL; + (util_format_get_blocksize(fb->zsbuf.format) > 2) != + (util_format_get_blocksize(fb->cbufs[0].format) > 2))) { + pipe_resource_reference(&nv30->framebuffer.zsbuf.texture, NULL); + memset(&nv30->framebuffer.zsbuf, 0, sizeof(nv30->framebuffer.zsbuf)); debug_printf("Mismatched color and zeta formats, ignoring zeta.\n"); } } + util_framebuffer_init(pipe, &nv30->framebuffer, nv30->fb_cbufs, &nv30->fb_zsbuf); } static void diff --git a/src/gallium/drivers/nouveau/nv30/nv30_state_validate.c b/src/gallium/drivers/nouveau/nv30/nv30_state_validate.c index 8de11ab67d0..1129f80c1e5 100644 --- a/src/gallium/drivers/nouveau/nv30/nv30_state_validate.c +++ b/src/gallium/drivers/nouveau/nv30/nv30_state_validate.c @@ -52,28 +52,28 @@ nv30_validate_fb(struct nv30_context *nv30) rt_format = 0; if (fb->nr_cbufs > 0) { - struct nv30_miptree *mt = nv30_miptree(fb->cbufs[0]->texture); - rt_format |= nv30_format(pscreen, fb->cbufs[0]->format)->hw; + struct nv30_miptree *mt = nv30_miptree(fb->cbufs[0].texture); + rt_format |= nv30_format(pscreen, fb->cbufs[0].format)->hw; rt_format |= mt->ms_mode; if (mt->swizzled) rt_format |= NV30_3D_RT_FORMAT_TYPE_SWIZZLED; else rt_format |= NV30_3D_RT_FORMAT_TYPE_LINEAR; } else { - if (fb->zsbuf && util_format_get_blocksize(fb->zsbuf->format) > 2) + if (fb->zsbuf.texture && util_format_get_blocksize(fb->zsbuf.format) > 2) rt_format |= NV30_3D_RT_FORMAT_COLOR_A8R8G8B8; else rt_format |= NV30_3D_RT_FORMAT_COLOR_R5G6B5; } - if (fb->zsbuf) { - rt_format |= nv30_format(pscreen, fb->zsbuf->format)->hw; - if (nv30_miptree(fb->zsbuf->texture)->swizzled) + if (fb->zsbuf.texture) { + rt_format |= nv30_format(pscreen, fb->zsbuf.format)->hw; + if (nv30_miptree(fb->zsbuf.texture)->swizzled) rt_format |= NV30_3D_RT_FORMAT_TYPE_SWIZZLED; else rt_format |= NV30_3D_RT_FORMAT_TYPE_LINEAR; } else { - if (fb->nr_cbufs && util_format_get_blocksize(fb->cbufs[0]->format) > 2) + if (fb->nr_cbufs && util_format_get_blocksize(fb->cbufs[0].format) > 2) rt_format |= NV30_3D_RT_FORMAT_ZETA_Z24S8; else rt_format |= NV30_3D_RT_FORMAT_ZETA_Z16; @@ -85,9 +85,9 @@ nv30_validate_fb(struct nv30_context *nv30) * we can hack around this limitation by adjusting the viewport origin */ if (nv30->state.rt_enable) { - int off = nv30_surface(fb->cbufs[0])->offset & 63; + int off = nv30_surface(nv30->fb_cbufs[0])->offset & 63; if (off) { - x += off / (util_format_get_blocksize(fb->cbufs[0]->format) * 2); + x += off / (util_format_get_blocksize(nv30->fb_cbufs[0]->format) * 2); w = 16; h = 2; } @@ -114,9 +114,9 @@ nv30_validate_fb(struct nv30_context *nv30) PUSH_DATA (push, ((w - 1) << 16) | 0); PUSH_DATA (push, ((h - 1) << 16) | 0); - if ((nv30->state.rt_enable & NV30_3D_RT_ENABLE_COLOR0) || fb->zsbuf) { - struct nv30_surface *rsf = nv30_surface(fb->cbufs[0]); - struct nv30_surface *zsf = nv30_surface(fb->zsbuf); + if ((nv30->state.rt_enable & NV30_3D_RT_ENABLE_COLOR0) || fb->zsbuf.texture) { + struct nv30_surface *rsf = nv30_surface(nv30->fb_cbufs[0]); + struct nv30_surface *zsf = nv30_surface(nv30->fb_zsbuf); struct nouveau_bo *rbo, *zbo; if (!rsf) rsf = zsf; @@ -140,7 +140,7 @@ nv30_validate_fb(struct nv30_context *nv30) } if (nv30->state.rt_enable & NV30_3D_RT_ENABLE_COLOR1) { - struct nv30_surface *sf = nv30_surface(fb->cbufs[1]); + struct nv30_surface *sf = nv30_surface(nv30->fb_cbufs[1]); struct nouveau_bo *bo = nv30_miptree(sf->base.texture)->base.bo; BEGIN_NV04(push, NV30_3D(COLOR1_OFFSET), 2); @@ -150,7 +150,7 @@ nv30_validate_fb(struct nv30_context *nv30) } if (nv30->state.rt_enable & NV40_3D_RT_ENABLE_COLOR2) { - struct nv30_surface *sf = nv30_surface(fb->cbufs[2]); + struct nv30_surface *sf = nv30_surface(nv30->fb_cbufs[2]); struct nouveau_bo *bo = nv30_miptree(sf->base.texture)->base.bo; BEGIN_NV04(push, NV40_3D(COLOR2_OFFSET), 1); @@ -161,7 +161,7 @@ nv30_validate_fb(struct nv30_context *nv30) } if (nv30->state.rt_enable & NV40_3D_RT_ENABLE_COLOR3) { - struct nv30_surface *sf = nv30_surface(fb->cbufs[3]); + struct nv30_surface *sf = nv30_surface(nv30->fb_cbufs[3]); struct nouveau_bo *bo = nv30_miptree(sf->base.texture)->base.bo; BEGIN_NV04(push, NV40_3D(COLOR3_OFFSET), 1); @@ -179,7 +179,7 @@ nv30_validate_blend_colour(struct nv30_context *nv30) float *rgba = nv30->blend_colour.color; if (nv30->framebuffer.nr_cbufs) { - switch (nv30->framebuffer.cbufs[0]->format) { + switch (nv30->framebuffer.cbufs[0].format) { case PIPE_FORMAT_R16G16B16A16_FLOAT: case PIPE_FORMAT_R32G32B32A32_FLOAT: BEGIN_NV04(push, NV30_3D(BLEND_COLOR), 1); diff --git a/src/gallium/drivers/nouveau/nv50/nv50_context.c b/src/gallium/drivers/nouveau/nv50/nv50_context.c index a41df15715e..192f1fda79f 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_context.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_context.c @@ -150,6 +150,7 @@ nv50_context_unreference_resources(struct nv50_context *nv50) nouveau_bufctx_del(&nv50->bufctx); nouveau_bufctx_del(&nv50->bufctx_cp); + util_framebuffer_init(&nv50->base.pipe, NULL, nv50->fb_cbufs, &nv50->fb_zsbuf); util_unreference_framebuffer_state(&nv50->framebuffer); assert(nv50->num_vtxbufs <= PIPE_MAX_ATTRIBS); @@ -214,8 +215,7 @@ nv50_invalidate_resource_storage(struct nouveau_context *ctx, if (bind & PIPE_BIND_RENDER_TARGET) { assert(nv50->framebuffer.nr_cbufs <= PIPE_MAX_COLOR_BUFS); for (i = 0; i < nv50->framebuffer.nr_cbufs; ++i) { - if (nv50->framebuffer.cbufs[i] && - nv50->framebuffer.cbufs[i]->texture == res) { + if (nv50->framebuffer.cbufs[i].texture == res) { nv50->dirty_3d |= NV50_NEW_3D_FRAMEBUFFER; nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_3D_FB); if (!--ref) @@ -224,8 +224,7 @@ nv50_invalidate_resource_storage(struct nouveau_context *ctx, } } if (bind & PIPE_BIND_DEPTH_STENCIL) { - if (nv50->framebuffer.zsbuf && - nv50->framebuffer.zsbuf->texture == res) { + if (nv50->framebuffer.zsbuf.texture == res) { nv50->dirty_3d |= NV50_NEW_3D_FRAMEBUFFER; nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_3D_FB); if (!--ref) diff --git a/src/gallium/drivers/nouveau/nv50/nv50_context.h b/src/gallium/drivers/nouveau/nv50/nv50_context.h index e1272381997..dab04db8b6d 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_context.h +++ b/src/gallium/drivers/nouveau/nv50/nv50_context.h @@ -9,6 +9,7 @@ #include "util/u_math.h" #include "util/u_inlines.h" #include "util/u_dynarray.h" +#include "util/u_framebuffer.h" #include "nv50/nv50_winsys.h" #include "nv50/nv50_stateobj.h" @@ -194,6 +195,7 @@ struct nv50_context { */ uint32_t so_used[4]; + PIPE_FB_SURFACES; //STOP USING THIS struct pipe_framebuffer_state framebuffer; struct pipe_blend_color blend_colour; struct pipe_stencil_ref stencil_ref; diff --git a/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c b/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c index fc3a673b371..547f0db2b3a 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_shader_state.c @@ -186,13 +186,13 @@ nv50_fragprog_validate(struct nv50_context *nv50) if (nv50->zsa && nv50->zsa->pipe.alpha_enabled) { struct pipe_framebuffer_state *fb = &nv50->framebuffer; - bool blendable = fb->nr_cbufs == 0 || !fb->cbufs[0] || + bool blendable = fb->nr_cbufs == 0 || !fb->cbufs[0].texture || nv50->screen->base.base.is_format_supported( &nv50->screen->base.base, - fb->cbufs[0]->format, - fb->cbufs[0]->texture->target, - fb->cbufs[0]->texture->nr_samples, - fb->cbufs[0]->texture->nr_storage_samples, + fb->cbufs[0].format, + fb->cbufs[0].texture->target, + fb->cbufs[0].texture->nr_samples, + fb->cbufs[0].texture->nr_storage_samples, PIPE_BIND_BLENDABLE); /* If we already have alphatest code, we have to keep updating * it. However we only have to have different code if the current RT0 is diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state.c b/src/gallium/drivers/nouveau/nv50/nv50_state.c index deebe2ca580..6e217cc1779 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_state.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_state.c @@ -1006,6 +1006,7 @@ nv50_set_framebuffer_state(struct pipe_context *pipe, nouveau_bufctx_reset(nv50->bufctx_3d, NV50_BIND_3D_FB); + util_framebuffer_init(pipe, fb, nv50->fb_cbufs, &nv50->fb_zsbuf); util_copy_framebuffer_state(&nv50->framebuffer, fb); nv50->dirty_3d |= NV50_NEW_3D_FRAMEBUFFER | NV50_NEW_3D_TEXTURES; diff --git a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c index daba9f730c6..29f93ac501e 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_state_validate.c @@ -38,13 +38,13 @@ nv50_validate_fb(struct nv50_context *nv50) struct nv50_surface *sf; struct nouveau_bo *bo; - if (!fb->cbufs[i]) { + if (!fb->cbufs[i].texture) { nv50_fb_set_null_rt(push, i); continue; } - mt = nv50_miptree(fb->cbufs[i]->texture); - sf = nv50_surface(fb->cbufs[i]); + mt = nv50_miptree(fb->cbufs[i].texture); + sf = nv50_surface(nv50->fb_cbufs[i]); bo = mt->base.bo; array_size = MIN2(array_size, sf->depth); @@ -78,7 +78,7 @@ nv50_validate_fb(struct nv50_context *nv50) BEGIN_NV04(push, NV50_3D(RT_ARRAY_MODE), 1); PUSH_DATA (push, 0); - assert(!fb->zsbuf); + assert(!fb->zsbuf.texture); assert(!mt->ms_mode); } @@ -93,15 +93,15 @@ nv50_validate_fb(struct nv50_context *nv50) BCTX_REFN(nv50->bufctx_3d, 3D_FB, &mt->base, WR); } - if (fb->zsbuf) { - struct nv50_miptree *mt = nv50_miptree(fb->zsbuf->texture); - struct nv50_surface *sf = nv50_surface(fb->zsbuf); + if (fb->zsbuf.texture) { + struct nv50_miptree *mt = nv50_miptree(fb->zsbuf.texture); + struct nv50_surface *sf = nv50_surface(nv50->fb_zsbuf); int unk = mt->base.base.target == PIPE_TEXTURE_3D || sf->depth == 1; BEGIN_NV04(push, NV50_3D(ZETA_ADDRESS_HIGH), 5); PUSH_DATAh(push, mt->base.address + sf->offset); PUSH_DATA (push, mt->base.address + sf->offset); - PUSH_DATA (push, nv50_format_table[fb->zsbuf->format].rt); + PUSH_DATA (push, nv50_format_table[fb->zsbuf.format].rt); PUSH_DATA (push, mt->level[sf->base.u.tex.level].tile_mode); PUSH_DATA (push, mt->layer_stride >> 2); BEGIN_NV04(push, NV50_3D(ZETA_ENABLE), 1); diff --git a/src/gallium/drivers/nouveau/nv50/nv50_surface.c b/src/gallium/drivers/nouveau/nv50/nv50_surface.c index 362d21c1d80..3980d1ca3f4 100644 --- a/src/gallium/drivers/nouveau/nv50/nv50_surface.c +++ b/src/gallium/drivers/nouveau/nv50/nv50_surface.c @@ -514,10 +514,10 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers, const struct pipe_scisso if (mode) { int zs_layers = 0, color0_layers = 0; - if (fb->cbufs[0] && (mode & 0x3c)) - color0_layers = nv50_surface(fb->cbufs[0])->depth; - if (fb->zsbuf && (mode & ~0x3c)) - zs_layers = nv50_surface(fb->zsbuf)->depth; + if (nv50->fb_cbufs[0] && (mode & 0x3c)) + color0_layers = nv50_surface(nv50->fb_cbufs[0])->depth; + if (nv50->fb_zsbuf && (mode & ~0x3c)) + zs_layers = nv50_surface(nv50->fb_zsbuf)->depth; for (j = 0; j < MIN2(zs_layers, color0_layers); j++) { BEGIN_NV04(push, NV50_3D(CLEAR_BUFFERS), 1); @@ -534,7 +534,7 @@ nv50_clear(struct pipe_context *pipe, unsigned buffers, const struct pipe_scisso } for (i = 1; i < fb->nr_cbufs; i++) { - struct pipe_surface *sf = fb->cbufs[i]; + struct pipe_surface *sf = nv50->fb_cbufs[i]; if (!sf || !(buffers & (PIPE_CLEAR_COLOR0 << i))) continue; for (j = 0; j < nv50_surface(sf)->depth; j++) { @@ -787,6 +787,7 @@ struct nv50_blitctx enum pipe_texture_target target; struct { struct pipe_framebuffer_state fb; + struct pipe_surface *cbuf0, *zsbuf; struct nv50_window_rect_stateobj window_rect; struct nv50_rasterizer_stateobj *rast; struct nv50_program *vp; @@ -1109,10 +1110,12 @@ nv50_blit_set_dst(struct nv50_blitctx *ctx, (res->target == PIPE_TEXTURE_3D ? res->depth0 : res->array_size) - 1; } - nv50->framebuffer.cbufs[0] = nv50_miptree_surface_new(pipe, res, &templ); + nv50->fb_cbufs[0] = nv50_miptree_surface_new(pipe, res, &templ); + nv50->framebuffer.cbufs[0] = templ; nv50->framebuffer.nr_cbufs = 1; - nv50->framebuffer.zsbuf = NULL; - pipe_surface_size(nv50->framebuffer.cbufs[0], &nv50->framebuffer.width, &nv50->framebuffer.height); + memset(&nv50->framebuffer.zsbuf, 0, sizeof(nv50->framebuffer.zsbuf)); + nv50->fb_zsbuf = NULL; + pipe_surface_size(&nv50->framebuffer.cbufs[0], &nv50->framebuffer.width, &nv50->framebuffer.height); } static void @@ -1233,6 +1236,8 @@ nv50_blitctx_pre_blit(struct nv50_blitctx *ctx, ctx->saved.fb.nr_cbufs = nv50->framebuffer.nr_cbufs; ctx->saved.fb.cbufs[0] = nv50->framebuffer.cbufs[0]; ctx->saved.fb.zsbuf = nv50->framebuffer.zsbuf; + ctx->saved.cbuf0 = nv50->fb_cbufs[0]; + ctx->saved.zsbuf = nv50->fb_zsbuf; ctx->saved.rast = nv50->rast; @@ -1291,13 +1296,15 @@ nv50_blitctx_post_blit(struct nv50_blitctx *blit) struct nv50_context *nv50 = blit->nv50; int s; - pipe_surface_reference(&nv50->framebuffer.cbufs[0], NULL); + pipe_surface_reference(&nv50->fb_cbufs[0], NULL); nv50->framebuffer.width = blit->saved.fb.width; nv50->framebuffer.height = blit->saved.fb.height; nv50->framebuffer.nr_cbufs = blit->saved.fb.nr_cbufs; nv50->framebuffer.cbufs[0] = blit->saved.fb.cbufs[0]; nv50->framebuffer.zsbuf = blit->saved.fb.zsbuf; + nv50->fb_cbufs[0] = blit->saved.cbuf0; + nv50->fb_zsbuf = blit->saved.zsbuf; nv50->rast = blit->saved.rast; diff --git a/src/gallium/drivers/nouveau/nv50/nv84_video.c b/src/gallium/drivers/nouveau/nv50/nv84_video.c index 840fc5df039..2fbd8fd661e 100644 --- a/src/gallium/drivers/nouveau/nv50/nv84_video.c +++ b/src/gallium/drivers/nouveau/nv50/nv84_video.c @@ -27,6 +27,7 @@ #include "util/format/u_format.h" #include "util/u_sampler.h" +#include "util/u_surface.h" #include "vl/vl_zscan.h" #include "nv50/nv84_video.h" @@ -585,7 +586,7 @@ nv84_video_buffer_sampler_view_components(struct pipe_video_buffer *buffer) return buf->sampler_view_components; } -static struct pipe_surface ** +static struct pipe_surface * nv84_video_buffer_surfaces(struct pipe_video_buffer *buffer) { struct nv84_video_buffer *buf = (struct nv84_video_buffer *)buffer; @@ -604,8 +605,6 @@ nv84_video_buffer_destroy(struct pipe_video_buffer *buffer) pipe_resource_reference(&buf->resources[i], NULL); pipe_sampler_view_reference(&buf->sampler_view_planes[i], NULL); pipe_sampler_view_reference(&buf->sampler_view_components[i], NULL); - pipe_surface_reference(&buf->surfaces[i * 2], NULL); - pipe_surface_reference(&buf->surfaces[i * 2 + 1], NULL); } nouveau_bo_ref(NULL, &buf->interlaced); @@ -733,18 +732,12 @@ nv84_video_buffer_create(struct pipe_context *pipe, memset(&surf_templ, 0, sizeof(surf_templ)); for (j = 0; j < 2; ++j) { - surf_templ.format = buffer->resources[j]->format; + u_surface_default_template(&surf_templ, buffer->resources[j]); surf_templ.u.tex.first_layer = surf_templ.u.tex.last_layer = 0; - buffer->surfaces[j * 2] = - pipe->create_surface(pipe, buffer->resources[j], &surf_templ); - if (!buffer->surfaces[j * 2]) - goto error; + buffer->surfaces[j * 2] = surf_templ; surf_templ.u.tex.first_layer = surf_templ.u.tex.last_layer = 1; - buffer->surfaces[j * 2 + 1] = - pipe->create_surface(pipe, buffer->resources[j], &surf_templ); - if (!buffer->surfaces[j * 2 + 1]) - goto error; + buffer->surfaces[j * 2 + 1] = surf_templ; } return &buffer->base; diff --git a/src/gallium/drivers/nouveau/nv50/nv84_video.h b/src/gallium/drivers/nouveau/nv50/nv84_video.h index 09773c12974..412b6962b9d 100644 --- a/src/gallium/drivers/nouveau/nv50/nv84_video.h +++ b/src/gallium/drivers/nouveau/nv50/nv84_video.h @@ -50,7 +50,7 @@ struct nv84_video_buffer { struct pipe_resource *resources[VL_NUM_COMPONENTS]; struct pipe_sampler_view *sampler_view_planes[VL_NUM_COMPONENTS]; struct pipe_sampler_view *sampler_view_components[VL_NUM_COMPONENTS]; - struct pipe_surface *surfaces[VL_NUM_COMPONENTS * 2]; + struct pipe_surface surfaces[VL_NUM_COMPONENTS * 2]; struct nouveau_bo *interlaced, *full; int mvidx; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.c b/src/gallium/drivers/nouveau/nvc0/nvc0_context.c index 4900099c7f4..3d56a121fa9 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.c @@ -195,6 +195,7 @@ nvc0_context_unreference_resources(struct nvc0_context *nvc0) nouveau_bufctx_del(&nvc0->bufctx); nouveau_bufctx_del(&nvc0->bufctx_cp); + util_framebuffer_init(&nvc0->base.pipe, NULL, nvc0->fb_cbufs, &nvc0->fb_zsbuf); util_unreference_framebuffer_state(&nvc0->framebuffer); for (i = 0; i < nvc0->num_vtxbufs; ++i) @@ -298,8 +299,7 @@ nvc0_invalidate_resource_storage(struct nouveau_context *ctx, if (res->bind & PIPE_BIND_RENDER_TARGET) { for (i = 0; i < nvc0->framebuffer.nr_cbufs; ++i) { - if (nvc0->framebuffer.cbufs[i] && - nvc0->framebuffer.cbufs[i]->texture == res) { + if (nvc0->framebuffer.cbufs[i].texture == res) { nvc0->dirty_3d |= NVC0_NEW_3D_FRAMEBUFFER; nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_3D_FB); if (!--ref) @@ -308,8 +308,7 @@ nvc0_invalidate_resource_storage(struct nouveau_context *ctx, } } if (res->bind & PIPE_BIND_DEPTH_STENCIL) { - if (nvc0->framebuffer.zsbuf && - nvc0->framebuffer.zsbuf->texture == res) { + if (nvc0->framebuffer.zsbuf.texture == res) { nvc0->dirty_3d |= NVC0_NEW_3D_FRAMEBUFFER; nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_3D_FB); if (!--ref) diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h index 6711e950e25..f2b7d75d10f 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_context.h +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_context.h @@ -9,6 +9,7 @@ #include "util/u_memory.h" #include "util/u_math.h" #include "util/u_inlines.h" +#include "util/u_framebuffer.h" #include "util/u_dynarray.h" #include "nvc0/nvc0_winsys.h" @@ -236,6 +237,7 @@ struct nvc0_context { struct list_head tex_head; struct list_head img_head; + PIPE_FB_SURFACES; //STOP USING THIS struct pipe_framebuffer_state framebuffer; bool sample_locations_enabled; uint8_t sample_locations[2 * 4 * 8]; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c index 2e2fd6518e4..950249c4c0f 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state.c @@ -912,6 +912,7 @@ nvc0_set_framebuffer_state(struct pipe_context *pipe, nouveau_bufctx_reset(nvc0->bufctx_3d, NVC0_BIND_3D_FB); + util_framebuffer_init(pipe, fb, nvc0->fb_cbufs, &nvc0->fb_zsbuf); util_copy_framebuffer_state(&nvc0->framebuffer, fb); nvc0->dirty_3d |= NVC0_NEW_3D_FRAMEBUFFER | NVC0_NEW_3D_SAMPLE_LOCATIONS | diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c index 0c567966a0b..98056828550 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c @@ -161,12 +161,12 @@ nvc0_validate_fb(struct nvc0_context *nvc0) struct nv04_resource *res; struct nouveau_bo *bo; - if (!fb->cbufs[i]) { + if (!fb->cbufs[i].texture) { nvc0_fb_set_null_rt(push, i, 0); continue; } - sf = nv50_surface(fb->cbufs[i]); + sf = nv50_surface(nvc0->fb_cbufs[i]); res = nv04_resource(sf->base.texture); bo = res->bo; @@ -204,7 +204,7 @@ nvc0_validate_fb(struct nvc0_context *nvc0) nvc0_resource_fence(nvc0, res, NOUVEAU_BO_WR); - assert(!fb->zsbuf); + assert(!fb->zsbuf.texture); } if (res->status & NOUVEAU_BUFFER_STATUS_GPU_READING) @@ -216,15 +216,15 @@ nvc0_validate_fb(struct nvc0_context *nvc0) BCTX_REFN(nvc0->bufctx_3d, 3D_FB, res, WR); } - if (fb->zsbuf) { - struct nv50_miptree *mt = nv50_miptree(fb->zsbuf->texture); - struct nv50_surface *sf = nv50_surface(fb->zsbuf); + if (fb->zsbuf.texture) { + struct nv50_miptree *mt = nv50_miptree(fb->zsbuf.texture); + struct nv50_surface *sf = nv50_surface(nvc0->fb_zsbuf); int unk = mt->base.base.target == PIPE_TEXTURE_2D; BEGIN_NVC0(push, NVC0_3D(ZETA_ADDRESS_HIGH), 5); PUSH_DATAh(push, mt->base.address + sf->offset); PUSH_DATA (push, mt->base.address + sf->offset); - PUSH_DATA (push, nvc0_format_table[fb->zsbuf->format].rt); + PUSH_DATA (push, nvc0_format_table[fb->zsbuf.format].rt); PUSH_DATA (push, mt->level[sf->base.u.tex.level].tile_mode); PUSH_DATA (push, mt->layer_stride >> 2); BEGIN_NVC0(push, NVC0_3D(ZETA_ENABLE), 1); @@ -250,7 +250,7 @@ nvc0_validate_fb(struct nvc0_context *nvc0) PUSH_DATA (push, 0); } - if (nr_cbufs == 0 && !fb->zsbuf) { + if (nr_cbufs == 0 && !fb->zsbuf.texture) { assert(util_is_power_of_two_or_zero(fb->samples)); assert(fb->samples <= 8); @@ -704,7 +704,7 @@ nvc0_validate_zsa_fb(struct nvc0_context *nvc0) struct nouveau_pushbuf *push = nvc0->base.pushbuf; if (nvc0->zsa && nvc0->zsa->pipe.alpha_enabled && - nvc0->framebuffer.zsbuf && + nvc0->framebuffer.zsbuf.texture && nvc0->framebuffer.nr_cbufs == 0) { nvc0_fb_set_null_rt(push, 0, 0); BEGIN_NVC0(push, NVC0_3D(RT_CONTROL), 1); @@ -724,7 +724,7 @@ nvc0_validate_rast_fb(struct nvc0_context *nvc0) if (rast->offset_units_unscaled) { BEGIN_NVC0(push, NVC0_3D(POLYGON_OFFSET_UNITS), 1); - if (fb->zsbuf && fb->zsbuf->format == PIPE_FORMAT_Z16_UNORM) + if (fb->zsbuf.texture && fb->zsbuf.format == PIPE_FORMAT_Z16_UNORM) PUSH_DATAf(push, rast->offset_units * (1 << 16)); else PUSH_DATAf(push, rast->offset_units * (1 << 24)); @@ -759,9 +759,9 @@ nvc0_validate_fbread(struct nvc0_context *nvc0) if (nvc0->fragprog && nvc0->fragprog->fp.reads_framebuffer && nvc0->framebuffer.nr_cbufs && - nvc0->framebuffer.cbufs[0]) { + nvc0->framebuffer.cbufs[0].texture) { struct pipe_sampler_view tmpl = {0}; - struct pipe_surface *sf = nvc0->framebuffer.cbufs[0]; + const struct pipe_surface *sf = &nvc0->framebuffer.cbufs[0]; tmpl.target = PIPE_TEXTURE_2D_ARRAY; tmpl.format = sf->format; diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c index 2339cdc5e51..1272b3a4469 100644 --- a/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c +++ b/src/gallium/drivers/nouveau/nvc0/nvc0_surface.c @@ -748,12 +748,12 @@ nvc0_clear(struct pipe_context *pipe, unsigned buffers, if (mode) { int zs_layers = 0, color0_layers = 0; - if (fb->cbufs[0] && (mode & 0x3c)) - color0_layers = fb->cbufs[0]->u.tex.last_layer - - fb->cbufs[0]->u.tex.first_layer + 1; - if (fb->zsbuf && (mode & ~0x3c)) - zs_layers = fb->zsbuf->u.tex.last_layer - - fb->zsbuf->u.tex.first_layer + 1; + if (fb->cbufs[0].texture && (mode & 0x3c)) + color0_layers = fb->cbufs[0].u.tex.last_layer - + fb->cbufs[0].u.tex.first_layer + 1; + if (fb->zsbuf.texture && (mode & ~0x3c)) + zs_layers = fb->zsbuf.u.tex.last_layer - + fb->zsbuf.u.tex.first_layer + 1; for (j = 0; j < MIN2(zs_layers, color0_layers); j++) { BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1); @@ -770,8 +770,8 @@ nvc0_clear(struct pipe_context *pipe, unsigned buffers, } for (i = 1; i < fb->nr_cbufs; i++) { - struct pipe_surface *sf = fb->cbufs[i]; - if (!sf || !(buffers & (PIPE_CLEAR_COLOR0 << i))) + const struct pipe_surface *sf = &fb->cbufs[i]; + if (!sf->texture || !(buffers & (PIPE_CLEAR_COLOR0 << i))) continue; for (j = 0; j <= sf->u.tex.last_layer - sf->u.tex.first_layer; j++) { BEGIN_NVC0(push, NVC0_3D(CLEAR_BUFFERS), 1); @@ -833,6 +833,7 @@ struct nvc0_blitctx enum pipe_texture_target target; struct { struct pipe_framebuffer_state fb; + struct pipe_surface *cbuf0, *zsbuf; struct nvc0_window_rect_stateobj window_rect; struct nvc0_rasterizer_stateobj *rast; struct nvc0_program *vp; @@ -977,10 +978,11 @@ nvc0_blit_set_dst(struct nvc0_blitctx *ctx, (res->target == PIPE_TEXTURE_3D ? res->depth0 : res->array_size) - 1; } - nvc0->framebuffer.cbufs[0] = nvc0_miptree_surface_new(pipe, res, &templ); + nvc0->framebuffer.cbufs[0] = templ; + nvc0->fb_cbufs[0] = nvc0_miptree_surface_new(pipe, res, &templ); nvc0->framebuffer.nr_cbufs = 1; - nvc0->framebuffer.zsbuf = NULL; - pipe_surface_size(nvc0->framebuffer.cbufs[0], &nvc0->framebuffer.width, &nvc0->framebuffer.height); + memset(&nvc0->framebuffer.zsbuf, 0, sizeof(nvc0->framebuffer.zsbuf)); + pipe_surface_size(&nvc0->framebuffer.cbufs[0], &nvc0->framebuffer.width, &nvc0->framebuffer.height); } static void @@ -1091,6 +1093,8 @@ nvc0_blitctx_pre_blit(struct nvc0_blitctx *ctx, ctx->saved.fb.nr_cbufs = nvc0->framebuffer.nr_cbufs; ctx->saved.fb.cbufs[0] = nvc0->framebuffer.cbufs[0]; ctx->saved.fb.zsbuf = nvc0->framebuffer.zsbuf; + ctx->saved.cbuf0 = nvc0->fb_cbufs[0]; + ctx->saved.zsbuf = nvc0->fb_zsbuf; ctx->saved.rast = nvc0->rast; @@ -1159,7 +1163,7 @@ nvc0_blitctx_post_blit(struct nvc0_blitctx *blit) struct nvc0_context *nvc0 = blit->nvc0; int s; - pipe_surface_reference(&nvc0->framebuffer.cbufs[0], NULL); + pipe_surface_reference(&nvc0->fb_cbufs[0], NULL); nvc0->framebuffer.width = blit->saved.fb.width; nvc0->framebuffer.height = blit->saved.fb.height; @@ -1168,6 +1172,8 @@ nvc0_blitctx_post_blit(struct nvc0_blitctx *blit) nvc0->framebuffer.nr_cbufs = blit->saved.fb.nr_cbufs; nvc0->framebuffer.cbufs[0] = blit->saved.fb.cbufs[0]; nvc0->framebuffer.zsbuf = blit->saved.fb.zsbuf; + nvc0->fb_cbufs[0] = blit->saved.cbuf0; + nvc0->fb_zsbuf = blit->saved.zsbuf; nvc0->rast = blit->saved.rast; diff --git a/src/gallium/drivers/panfrost/pan_blit.c b/src/gallium/drivers/panfrost/pan_blit.c index 5ec8d5950ef..abc756a146a 100644 --- a/src/gallium/drivers/panfrost/pan_blit.c +++ b/src/gallium/drivers/panfrost/pan_blit.c @@ -118,5 +118,7 @@ panfrost_blit(struct pipe_context *pipe, const struct pipe_blit_info *info) enum pipe_format dst_view_format = util_format_linear(info->dst.format); pan_legalize_format(ctx, dst, dst_view_format, true, false); + panfrost_flush_all_batches(ctx, "Blit"); panfrost_blit_no_afbc_legalization(pipe, info); + panfrost_flush_all_batches(ctx, "Blit"); } diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.c b/src/gallium/drivers/panfrost/pan_cmdstream.c index dd3a0782af2..794e0b51b90 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.c +++ b/src/gallium/drivers/panfrost/pan_cmdstream.c @@ -262,7 +262,7 @@ panfrost_get_blend_shaders(struct panfrost_batch *batch, bool used = false; for (unsigned c = 0; c < batch->key.nr_cbufs; ++c) { - if (batch->key.cbufs[c]) { + if (batch->key.cbufs[c].texture) { blend_shaders[c] = panfrost_get_blend(batch, c); if (blend_shaders[c]) used = true; @@ -303,7 +303,7 @@ panfrost_emit_blend(struct panfrost_batch *batch, void *rts, struct mali_blend_packed *packed = rts + (i * pan_size(BLEND)); /* Disable blending for unbacked render targets */ - if (rt_count == 0 || !batch->key.cbufs[i] || !so->info[i].enabled) { + if (rt_count == 0 || !batch->key.cbufs[i].texture || !so->info[i].enabled) { pan_pack(packed, BLEND, cfg) { cfg.enable = false; #if PAN_ARCH >= 6 @@ -315,7 +315,7 @@ panfrost_emit_blend(struct panfrost_batch *batch, void *rts, } struct pan_blend_info info = so->info[i]; - enum pipe_format format = batch->key.cbufs[i]->format; + enum pipe_format format = batch->key.cbufs[i].format; float cons = pan_blend_get_constant(info.constant_mask, ctx->blend_color.color); @@ -429,8 +429,8 @@ panfrost_emit_compute_shader_meta(struct panfrost_batch *batch, static float panfrost_z_depth_offset(struct panfrost_context *ctx, float offset_units) { - if (ctx->pipe_framebuffer.zsbuf) { - if (util_format_is_float(ctx->pipe_framebuffer.zsbuf->format)) { + if (ctx->pipe_framebuffer.zsbuf.texture) { + if (util_format_is_float(ctx->pipe_framebuffer.zsbuf.format)) { /* no scaling necessary, hw will do this at run time */ return offset_units; } @@ -532,7 +532,7 @@ panfrost_prepare_fs_state(struct panfrost_context *ctx, uint64_t *blend_shaders, cfg.multisample_misc.blend_shader = (blend_shaders[0] != 0); cfg.stencil_mask_misc.write_enable = so->info[0].enabled; cfg.stencil_mask_misc.srgb = - util_format_is_srgb(ctx->pipe_framebuffer.cbufs[0]->format); + util_format_is_srgb(ctx->pipe_framebuffer.cbufs[0].format); cfg.stencil_mask_misc.dither_disable = !so->base.dither; cfg.stencil_mask_misc.alpha_to_one = so->base.alpha_to_one; @@ -1256,8 +1256,8 @@ panfrost_upload_rt_conversion_sysval(struct panfrost_batch *batch, unsigned rt = size_and_rt & 0xF; unsigned size = size_and_rt >> 4; - if (rt < batch->key.nr_cbufs && batch->key.cbufs[rt]) { - enum pipe_format format = batch->key.cbufs[rt]->format; + if (rt < batch->key.nr_cbufs && batch->key.cbufs[rt].texture) { + enum pipe_format format = batch->key.cbufs[rt].format; uniform->u[0] = GENX(pan_blend_get_internal_desc)(format, rt, size, false) >> 32; } else { @@ -2812,7 +2812,7 @@ static void panfrost_initialize_surface(struct panfrost_batch *batch, struct pipe_surface *surf) { - if (surf) { + if (surf->texture) { struct panfrost_resource *rsrc = pan_resource(surf->texture); BITSET_SET(rsrc->valid.data, surf->u.tex.level); if (rsrc->separate_stencil) @@ -2834,9 +2834,9 @@ emit_fragment_job(struct panfrost_batch *batch, const struct pan_fb_info *pfb) struct pipe_framebuffer_state *fb = &batch->key; for (unsigned i = 0; i < fb->nr_cbufs; ++i) - panfrost_initialize_surface(batch, fb->cbufs[i]); + panfrost_initialize_surface(batch, &fb->cbufs[i]); - panfrost_initialize_surface(batch, fb->zsbuf); + panfrost_initialize_surface(batch, &fb->zsbuf); /* The passed tile coords can be out of range in some cases, so we need * to clamp them to the framebuffer size to avoid a TILE_RANGE_FAULT. diff --git a/src/gallium/drivers/panfrost/pan_cmdstream.h b/src/gallium/drivers/panfrost/pan_cmdstream.h index 6de1bee2f3b..74882742770 100644 --- a/src/gallium/drivers/panfrost/pan_cmdstream.h +++ b/src/gallium/drivers/panfrost/pan_cmdstream.h @@ -146,7 +146,7 @@ panfrost_overdraw_alpha(const struct panfrost_context *ctx, bool zero) for (unsigned i = 0; i < ctx->pipe_framebuffer.nr_cbufs; ++i) { const struct pan_blend_info info = so->info[i]; - bool enabled = ctx->pipe_framebuffer.cbufs[i] && !info.enabled; + bool enabled = ctx->pipe_framebuffer.cbufs[i].texture && !info.enabled; bool flag = zero ? info.alpha_zero_nop : info.alpha_one_store; if (enabled && !flag) @@ -234,7 +234,7 @@ panfrost_fs_required(struct panfrost_compiled_shader *fs, /* If colour is written we need to execute */ for (unsigned i = 0; i < state->nr_cbufs; ++i) { - if (state->cbufs[i] && blend->info[i].enabled) + if (state->cbufs[i].texture && blend->info[i].enabled) return true; } diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c index 6962ce1c803..4915113a8d4 100644 --- a/src/gallium/drivers/panfrost/pan_context.c +++ b/src/gallium/drivers/panfrost/pan_context.c @@ -176,7 +176,7 @@ panfrost_get_blend(struct panfrost_batch *batch, unsigned rti) struct panfrost_device *dev = pan_device(ctx->base.screen); struct panfrost_blend_state *blend = ctx->blend; struct pan_blend_info info = blend->info[rti]; - struct pipe_surface *surf = batch->key.cbufs[rti]; + struct pipe_surface *surf = &batch->key.cbufs[rti]; enum pipe_format fmt = surf->format; /* Use fixed-function if the equation permits, the format is blendable, @@ -451,7 +451,7 @@ panfrost_set_framebuffer_state(struct pipe_context *pctx, ctx->fb_rt_mask = 0; for (unsigned i = 0; i < ctx->pipe_framebuffer.nr_cbufs; ++i) { - if (ctx->pipe_framebuffer.cbufs[i]) + if (ctx->pipe_framebuffer.cbufs[i].texture) ctx->fb_rt_mask |= BITFIELD_BIT(i); } } diff --git a/src/gallium/drivers/panfrost/pan_helpers.c b/src/gallium/drivers/panfrost/pan_helpers.c index 603d757be78..fe0f714078d 100644 --- a/src/gallium/drivers/panfrost/pan_helpers.c +++ b/src/gallium/drivers/panfrost/pan_helpers.c @@ -214,7 +214,7 @@ panfrost_set_batch_masks_blend(struct panfrost_batch *batch) struct panfrost_blend_state *blend = ctx->blend; for (unsigned i = 0; i < batch->key.nr_cbufs; ++i) { - if (blend->info[i].enabled && batch->key.cbufs[i]) + if (blend->info[i].enabled && batch->key.cbufs[i].texture) panfrost_draw_target(batch, PIPE_CLEAR_COLOR0 << i); } } diff --git a/src/gallium/drivers/panfrost/pan_job.c b/src/gallium/drivers/panfrost/pan_job.c index d36f93dc61f..30319d6296f 100644 --- a/src/gallium/drivers/panfrost/pan_job.c +++ b/src/gallium/drivers/panfrost/pan_job.c @@ -64,7 +64,7 @@ static void panfrost_batch_add_surface(struct panfrost_batch *batch, struct pipe_surface *surf) { - if (surf) { + if (surf->texture) { struct panfrost_resource *rsrc = pan_resource(surf->texture); pan_legalize_format(batch->ctx, rsrc, surf->format, true, false); panfrost_batch_write_rsrc(batch, rsrc, PIPE_SHADER_FRAGMENT); @@ -105,9 +105,9 @@ panfrost_batch_init(struct panfrost_context *ctx, return -1; for (unsigned i = 0; i < batch->key.nr_cbufs; ++i) - panfrost_batch_add_surface(batch, batch->key.cbufs[i]); + panfrost_batch_add_surface(batch, &batch->key.cbufs[i]); - panfrost_batch_add_surface(batch, batch->key.zsbuf); + panfrost_batch_add_surface(batch, &batch->key.zsbuf); return screen->vtbl.init_batch(batch); } @@ -501,9 +501,9 @@ panfrost_batch_to_fb_info(const struct panfrost_batch *batch, }; for (unsigned i = 0; i < fb->rt_count; i++) { - struct pipe_surface *surf = batch->key.cbufs[i]; + const struct pipe_surface *surf = &batch->key.cbufs[i]; - if (!surf) + if (!surf->texture) continue; struct panfrost_resource *prsrc = pan_resource(surf->texture); @@ -553,8 +553,8 @@ panfrost_batch_to_fb_info(const struct panfrost_batch *batch, const struct pan_image_view *s_view = NULL, *z_view = NULL; struct panfrost_resource *z_rsrc = NULL, *s_rsrc = NULL; - if (batch->key.zsbuf) { - struct pipe_surface *surf = batch->key.zsbuf; + if (batch->key.zsbuf.texture) { + const struct pipe_surface *surf = &batch->key.zsbuf; z_rsrc = pan_resource(surf->texture); zs->format = surf->format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT @@ -639,11 +639,11 @@ panfrost_batch_to_fb_info(const struct panfrost_batch *batch, static void panfrost_emit_tile_map(struct panfrost_batch *batch, struct pan_fb_info *fb) { - if (batch->key.nr_cbufs < 1 || !batch->key.cbufs[0]) + if (batch->key.nr_cbufs < 1 || !batch->key.cbufs[0].texture) return; - struct pipe_surface *surf = batch->key.cbufs[0]; - struct panfrost_resource *pres = surf ? pan_resource(surf->texture) : NULL; + struct pipe_surface *surf = &batch->key.cbufs[0]; + struct panfrost_resource *pres = pan_resource(surf->texture); if (pres && pres->damage.tile_map.enable) { fb->tile_map.base = @@ -668,8 +668,8 @@ panfrost_batch_submit(struct panfrost_context *ctx, if (!has_frag && batch->compute_count == 0 && !batch->has_time_query) goto out; - if (batch->key.zsbuf && has_frag) { - struct pipe_surface *surf = batch->key.zsbuf; + if (batch->key.zsbuf.texture && has_frag) { + struct pipe_surface *surf = &batch->key.zsbuf; struct panfrost_resource *z_rsrc = pan_resource(surf->texture); /* if there are multiple levels or layers, we optimize only the first */ @@ -711,11 +711,11 @@ panfrost_batch_submit(struct panfrost_context *ctx, * it flushed, the easiest solution is to reload everything. */ for (unsigned i = 0; i < batch->key.nr_cbufs; i++) { - if (!batch->key.cbufs[i]) + if (!batch->key.cbufs[i].texture) continue; panfrost_resource_set_damage_region( - ctx->base.screen, batch->key.cbufs[i]->texture, 0, NULL); + ctx->base.screen, batch->key.cbufs[i].texture, 0, NULL); } out: @@ -829,7 +829,7 @@ panfrost_batch_clear(struct panfrost_batch *batch, unsigned buffers, if (!(buffers & (PIPE_CLEAR_COLOR0 << i))) continue; - enum pipe_format format = ctx->pipe_framebuffer.cbufs[i]->format; + enum pipe_format format = ctx->pipe_framebuffer.cbufs[i].format; pan_pack_color(dev->blendable_formats, batch->clear_color[i], color, format, false); } diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c index 64b39f56017..26ca139ec6b 100644 --- a/src/gallium/drivers/panfrost/pan_resource.c +++ b/src/gallium/drivers/panfrost/pan_resource.c @@ -1988,13 +1988,13 @@ panfrost_invalidate_resource(struct pipe_context *pctx, rsrc->constant_stencil = true; /* Handle the glInvalidateFramebuffer case */ - if (batch->key.zsbuf && batch->key.zsbuf->texture == prsrc) + if (batch->key.zsbuf.texture == prsrc) batch->resolve &= ~PIPE_CLEAR_DEPTHSTENCIL; for (unsigned i = 0; i < batch->key.nr_cbufs; ++i) { - struct pipe_surface *surf = batch->key.cbufs[i]; + struct pipe_surface *surf = &batch->key.cbufs[i]; - if (surf && surf->texture == prsrc) + if (surf->texture == prsrc) batch->resolve &= ~(PIPE_CLEAR_COLOR0 << i); } } diff --git a/src/gallium/drivers/panfrost/pan_shader.c b/src/gallium/drivers/panfrost/pan_shader.c index 933b9d3dae6..816afbb34df 100644 --- a/src/gallium/drivers/panfrost/pan_shader.c +++ b/src/gallium/drivers/panfrost/pan_shader.c @@ -335,8 +335,8 @@ panfrost_build_fs_key(struct panfrost_context *ctx, u_foreach_bit(i, (nir->info.outputs_read >> FRAG_RESULT_DATA0)) { enum pipe_format fmt = PIPE_FORMAT_R8G8B8A8_UNORM; - if ((fb->nr_cbufs > i) && fb->cbufs[i]) - fmt = fb->cbufs[i]->format; + if ((fb->nr_cbufs > i) && fb->cbufs[i].texture) + fmt = fb->cbufs[i].format; if (pan_blendable_formats_v6[fmt].internal) fmt = PIPE_FORMAT_NONE; diff --git a/src/gallium/drivers/r300/r300_blit.c b/src/gallium/drivers/r300/r300_blit.c index dd83858a4c8..dd17bd55e4f 100644 --- a/src/gallium/drivers/r300/r300_blit.c +++ b/src/gallium/drivers/r300/r300_blit.c @@ -123,10 +123,10 @@ static bool r300_cbzb_clear_allowed(struct r300_context *r300, (struct pipe_framebuffer_state*)r300->fb_state.state; /* Only color clear allowed, and only one colorbuffer. */ - if ((clear_buffers & ~PIPE_CLEAR_COLOR) != 0 || fb->nr_cbufs != 1 || !fb->cbufs[0]) + if ((clear_buffers & ~PIPE_CLEAR_COLOR) != 0 || fb->nr_cbufs != 1 || !fb->cbufs[0].texture) return false; - return r300_surface(fb->cbufs[0])->cbzb_allowed; + return r300_surface(r300->fb_cbufs[0])->cbzb_allowed; } static bool r300_fast_zclear_allowed(struct r300_context *r300, @@ -135,7 +135,7 @@ static bool r300_fast_zclear_allowed(struct r300_context *r300, struct pipe_framebuffer_state *fb = (struct pipe_framebuffer_state*)r300->fb_state.state; - return r300_resource(fb->zsbuf->texture)->tex.zmask_dwords[fb->zsbuf->u.tex.level] != 0; + return r300_resource(fb->zsbuf.texture)->tex.zmask_dwords[fb->zsbuf.u.tex.level] != 0; } static bool r300_hiz_clear_allowed(struct r300_context *r300) @@ -143,7 +143,7 @@ static bool r300_hiz_clear_allowed(struct r300_context *r300) struct pipe_framebuffer_state *fb = (struct pipe_framebuffer_state*)r300->fb_state.state; - return r300_resource(fb->zsbuf->texture)->tex.hiz_dwords[fb->zsbuf->u.tex.level] != 0; + return r300_resource(fb->zsbuf.texture)->tex.hiz_dwords[fb->zsbuf.u.tex.level] != 0; } static uint32_t r300_depth_clear_value(enum pipe_format format, @@ -178,10 +178,10 @@ static void r300_set_clear_color(struct r300_context *r300, union util_color uc; memset(&uc, 0, sizeof(uc)); - util_pack_color(color->f, fb->cbufs[0]->format, &uc); + util_pack_color(color->f, fb->cbufs[0].format, &uc); - if (fb->cbufs[0]->format == PIPE_FORMAT_R16G16B16A16_FLOAT || - fb->cbufs[0]->format == PIPE_FORMAT_R16G16B16X16_FLOAT) { + if (fb->cbufs[0].format == PIPE_FORMAT_R16G16B16A16_FLOAT || + fb->cbufs[0].format == PIPE_FORMAT_R16G16B16X16_FLOAT) { /* (0,1,2,3) maps to (B,G,R,A) */ r300->color_clear_value_gb = uc.h[0] | ((uint32_t)uc.h[1] << 16); r300->color_clear_value_ar = uc.h[2] | ((uint32_t)uc.h[3] << 16); @@ -259,7 +259,7 @@ static void r300_clear(struct pipe_context* pipe, bool zmask_clear, hiz_clear; /* If both depth and stencil are present, they must be cleared together. */ - if (fb->zsbuf->texture->format == PIPE_FORMAT_S8_UINT_Z24_UNORM && + if (fb->zsbuf.texture->format == PIPE_FORMAT_S8_UINT_Z24_UNORM && (buffers & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) { zmask_clear = false; hiz_clear = false; @@ -287,7 +287,7 @@ static void r300_clear(struct pipe_context* pipe, if (r300->hyperz_enabled) { if (zmask_clear) { hyperz_dcv = hyperz->zb_depthclearvalue = - r300_depth_clear_value(fb->zsbuf->format, depth, stencil); + r300_depth_clear_value(fb->zsbuf.format, depth, stencil); r300_mark_atom_dirty(r300, &r300->zmask_clear); r300_mark_atom_dirty(r300, &r300->gpu_flush); @@ -307,8 +307,8 @@ static void r300_clear(struct pipe_context* pipe, /* Use fast color clear for an AA colorbuffer. * The CMASK is shared between all colorbuffers, so we use it * if there is only one colorbuffer bound. */ - if ((buffers & PIPE_CLEAR_COLOR) && fb->nr_cbufs == 1 && fb->cbufs[0] && - r300_resource(fb->cbufs[0]->texture)->tex.cmask_dwords) { + if ((buffers & PIPE_CLEAR_COLOR) && fb->nr_cbufs == 1 && fb->cbufs[0].texture && + r300_resource(fb->cbufs[0].texture)->tex.cmask_dwords) { /* Try to obtain the access to the CMASK if we don't have one. */ if (!r300->cmask_access) { r300->cmask_access = @@ -328,12 +328,12 @@ static void r300_clear(struct pipe_context* pipe, /* Don't reference this, so that the texture can be * destroyed while set in cmask_resource. * Then in texture_destroy, we set cmask_resource to NULL. */ - r300->screen->cmask_resource = fb->cbufs[0]->texture; + r300->screen->cmask_resource = fb->cbufs[0].texture; } mtx_unlock(&r300->screen->cmask_mutex); } - if (r300->screen->cmask_resource == fb->cbufs[0]->texture) { + if (r300->screen->cmask_resource == fb->cbufs[0].texture) { r300_set_clear_color(r300, color); r300_mark_atom_dirty(r300, &r300->cmask_clear); r300_mark_atom_dirty(r300, &r300->gpu_flush); @@ -343,7 +343,7 @@ static void r300_clear(struct pipe_context* pipe, } /* Enable CBZB clear. */ else if (r300_cbzb_clear_allowed(r300, buffers)) { - struct r300_surface *surf = r300_surface(fb->cbufs[0]); + struct r300_surface *surf = r300_surface(r300->fb_cbufs[0]); hyperz->zb_depthclearvalue = r300_depth_clear_cb_value(surf->base.format, color->f); @@ -452,7 +452,7 @@ static void r300_clear_depth_stencil(struct pipe_context *pipe, (struct pipe_framebuffer_state*)r300->fb_state.state; if (r300->zmask_in_use && !r300->locked_zbuffer) { - if (fb->zsbuf->texture == dst->texture) { + if (fb->zsbuf.texture == dst->texture) { r300_decompress_zmask(r300); } } @@ -492,7 +492,7 @@ void r300_decompress_zmask_locked_unsafe(struct r300_context *r300) memset(&fb, 0, sizeof(fb)); pipe_surface_size(r300->locked_zbuffer, &fb.width, &fb.height); - fb.zsbuf = r300->locked_zbuffer; + fb.zsbuf = *r300->locked_zbuffer; r300->context.set_framebuffer_state(&r300->context, &fb); r300_decompress_zmask(r300); @@ -652,8 +652,8 @@ static void r300_resource_copy_region(struct pipe_context *pipe, /* Decompress ZMASK. */ if (r300->zmask_in_use && !r300->locked_zbuffer) { - if (fb->zsbuf->texture == src || - fb->zsbuf->texture == dst) { + if (fb->zsbuf.texture == src || + fb->zsbuf.texture == dst) { r300_decompress_zmask(r300); } } @@ -851,8 +851,8 @@ static void r300_blit(struct pipe_context *pipe, /* Decompress ZMASK. */ if (r300->zmask_in_use && !r300->locked_zbuffer) { - if (fb->zsbuf->texture == info.src.resource || - fb->zsbuf->texture == info.dst.resource) { + if (fb->zsbuf.texture == info.src.resource || + fb->zsbuf.texture == info.dst.resource) { r300_decompress_zmask(r300); } } diff --git a/src/gallium/drivers/r300/r300_context.c b/src/gallium/drivers/r300/r300_context.c index 08214a984c0..1188f6390cd 100644 --- a/src/gallium/drivers/r300/r300_context.c +++ b/src/gallium/drivers/r300/r300_context.c @@ -31,6 +31,7 @@ static void r300_release_referenced_objects(struct r300_context *r300) unsigned i; /* Framebuffer state. */ + util_framebuffer_init(&r300->context, NULL, r300->fb_cbufs, &r300->fb_zsbuf); util_unreference_framebuffer_state(fb); /* Textures. */ diff --git a/src/gallium/drivers/r300/r300_context.h b/src/gallium/drivers/r300/r300_context.h index f29b9d713e0..f3ca1995334 100644 --- a/src/gallium/drivers/r300/r300_context.h +++ b/src/gallium/drivers/r300/r300_context.h @@ -13,6 +13,7 @@ #include "util/u_blitter.h" #include "pipe/p_context.h" +#include "util/u_framebuffer.h" #include "util/u_inlines.h" #include "util/u_transfer.h" @@ -465,6 +466,8 @@ struct r300_context { /* Query list. */ struct r300_query query_list; + PIPE_FB_SURFACES; //STOP USING THIS + /* Various CSO state objects. */ /* Each atom is emitted in the order it appears here, which can affect @@ -679,15 +682,15 @@ static inline void r300_mark_atom_dirty(struct r300_context *r300, } static inline struct pipe_surface * -r300_get_nonnull_cb(struct pipe_framebuffer_state *fb, unsigned i) +r300_get_nonnull_cb(struct r300_context *r300, struct pipe_framebuffer_state *fb, unsigned i) { - if (fb->cbufs[i]) - return fb->cbufs[i]; + if (r300->fb_cbufs[i]) + return r300->fb_cbufs[i]; /* The i-th framebuffer is NULL, return any non-NULL one. */ for (i = 0; i < fb->nr_cbufs; i++) - if (fb->cbufs[i]) - return fb->cbufs[i]; + if (r300->fb_cbufs[i]) + return r300->fb_cbufs[i]; return NULL; } diff --git a/src/gallium/drivers/r300/r300_emit.c b/src/gallium/drivers/r300/r300_emit.c index f2a40b0108e..c317a1e879d 100644 --- a/src/gallium/drivers/r300/r300_emit.c +++ b/src/gallium/drivers/r300/r300_emit.c @@ -27,7 +27,7 @@ void r300_emit_blend_state(struct r300_context* r300, struct pipe_surface *cb; CS_LOCALS(r300); - cb = fb->nr_cbufs ? r300_get_nonnull_cb(fb, 0) : NULL; + cb = fb->nr_cbufs ? r300_get_nonnull_cb(r300, fb, 0) : NULL; if (cb) { if (cb->format == PIPE_FORMAT_R16G16B16A16_FLOAT) { @@ -73,7 +73,7 @@ void r300_emit_dsa_state(struct r300_context* r300, unsigned size, void* state) /* Choose the alpha ref value between 8-bit (FG_ALPHA_FUNC.AM_VAL) and * 16-bit (FG_ALPHA_VALUE). */ if (is_r500 && (alpha_func & R300_FG_ALPHA_FUNC_ENABLE)) { - struct pipe_surface *cb = fb->nr_cbufs ? r300_get_nonnull_cb(fb, 0) : NULL; + struct pipe_surface *cb = fb->nr_cbufs ? r300_get_nonnull_cb(r300, fb, 0) : NULL; if (cb && (cb->format == PIPE_FORMAT_R16G16B16A16_FLOAT || @@ -93,7 +93,7 @@ void r300_emit_dsa_state(struct r300_context* r300, unsigned size, void* state) BEGIN_CS(size); OUT_CS_REG(R300_FG_ALPHA_FUNC, alpha_func); - OUT_CS_TABLE(fb->zsbuf ? &dsa->cb_begin : dsa->cb_zb_no_readwrite, size-2); + OUT_CS_TABLE(fb->zsbuf.texture ? &dsa->cb_begin : dsa->cb_zb_no_readwrite, size-2); END_CS; } @@ -336,7 +336,7 @@ void r300_emit_gpu_flush(struct r300_context *r300, unsigned size, void *state) CS_LOCALS(r300); if (r300->cbzb_clear) { - struct r300_surface *surf = r300_surface(fb->cbufs[0]); + struct r300_surface *surf = r300_surface(r300->fb_cbufs[0]); height = surf->cbzb_height; width = surf->cbzb_width; @@ -416,7 +416,7 @@ void r300_emit_fb_state(struct r300_context* r300, unsigned size, void* state) /* Set up colorbuffers. */ for (i = 0; i < fb->nr_cbufs; i++) { - surf = r300_surface(r300_get_nonnull_cb(fb, i)); + surf = r300_surface(r300_get_nonnull_cb(r300, fb, i)); OUT_CS_REG(R300_RB3D_COLOROFFSET0 + (4 * i), surf->offset); OUT_CS_RELOC(surf); @@ -438,7 +438,7 @@ void r300_emit_fb_state(struct r300_context* r300, unsigned size, void* state) /* Set up the ZB part of the CBZB clear. */ if (r300->cbzb_clear) { - surf = r300_surface(fb->cbufs[0]); + surf = r300_surface(r300->fb_cbufs[0]); OUT_CS_REG(R300_ZB_FORMAT, surf->cbzb_format); @@ -453,8 +453,8 @@ void r300_emit_fb_state(struct r300_context* r300, unsigned size, void* state) surf->cbzb_pitch); } /* Set up a zbuffer. */ - else if (fb->zsbuf) { - surf = r300_surface(fb->zsbuf); + else if (fb->zsbuf.texture) { + surf = r300_surface(r300->fb_zsbuf); OUT_CS_REG(R300_ZB_FORMAT, surf->format); @@ -597,7 +597,7 @@ void r300_emit_fb_state_pipelined(struct r300_context *r300, * (must be written after unpipelined regs) */ OUT_CS_REG_SEQ(R300_US_OUT_FMT_0, 4); for (i = 0; i < num_cbufs; i++) { - OUT_CS(r300_surface(r300_get_nonnull_cb(fb, i))->format); + OUT_CS(r300_surface(r300_get_nonnull_cb(r300, fb, i))->format); } for (; i < 1; i++) { OUT_CS(R300_US_OUT_FMT_C4_8 | @@ -1221,12 +1221,12 @@ void r300_emit_hiz_clear(struct r300_context *r300, unsigned size, void *state) struct r300_resource* tex; CS_LOCALS(r300); - tex = r300_resource(fb->zsbuf->texture); + tex = r300_resource(fb->zsbuf.texture); BEGIN_CS(size); OUT_CS_PKT3(R300_PACKET3_3D_CLEAR_HIZ, 2); OUT_CS(0); - OUT_CS(tex->tex.hiz_dwords[fb->zsbuf->u.tex.level]); + OUT_CS(tex->tex.hiz_dwords[fb->zsbuf.u.tex.level]); OUT_CS(r300->hiz_clear_value); END_CS; @@ -1243,12 +1243,12 @@ void r300_emit_zmask_clear(struct r300_context *r300, unsigned size, void *state struct r300_resource *tex; CS_LOCALS(r300); - tex = r300_resource(fb->zsbuf->texture); + tex = r300_resource(fb->zsbuf.texture); BEGIN_CS(size); OUT_CS_PKT3(R300_PACKET3_3D_CLEAR_ZMASK, 2); OUT_CS(0); - OUT_CS(tex->tex.zmask_dwords[fb->zsbuf->u.tex.level]); + OUT_CS(tex->tex.zmask_dwords[fb->zsbuf.u.tex.level]); OUT_CS(0); END_CS; @@ -1264,7 +1264,7 @@ void r300_emit_cmask_clear(struct r300_context *r300, unsigned size, void *state struct r300_resource *tex; CS_LOCALS(r300); - tex = r300_resource(fb->cbufs[0]->texture); + tex = r300_resource(fb->cbufs[0].texture); BEGIN_CS(size); OUT_CS_PKT3(R300_PACKET3_3D_CLEAR_CMASK, 2); @@ -1315,27 +1315,27 @@ validate: if (r300->fb_state.dirty) { /* Color buffers... */ for (i = 0; i < fb->nr_cbufs; i++) { - if (!fb->cbufs[i]) + if (!fb->cbufs[i].texture) continue; - tex = r300_resource(fb->cbufs[i]->texture); + tex = r300_resource(fb->cbufs[i].texture); assert(tex && tex->buf && "cbuf is marked, but NULL!"); r300->rws->cs_add_buffer(&r300->cs, tex->buf, RADEON_USAGE_READWRITE | RADEON_USAGE_SYNCHRONIZED | (tex->b.nr_samples > 1 ? RADEON_PRIO_COLOR_BUFFER_MSAA : RADEON_PRIO_COLOR_BUFFER), - r300_surface(fb->cbufs[i])->domain); + r300_surface(r300->fb_cbufs[i])->domain); } /* ...depth buffer... */ - if (fb->zsbuf) { - tex = r300_resource(fb->zsbuf->texture); + if (fb->zsbuf.texture) { + tex = r300_resource(fb->zsbuf.texture); assert(tex && tex->buf && "zsbuf is marked, but NULL!"); r300->rws->cs_add_buffer(&r300->cs, tex->buf, RADEON_USAGE_READWRITE | RADEON_USAGE_SYNCHRONIZED | (tex->b.nr_samples > 1 ? RADEON_PRIO_DEPTH_BUFFER_MSAA : RADEON_PRIO_DEPTH_BUFFER), - r300_surface(fb->zsbuf)->domain); + r300_surface(r300->fb_zsbuf)->domain); } } /* The AA resolve buffer. */ diff --git a/src/gallium/drivers/r300/r300_hyperz.c b/src/gallium/drivers/r300/r300_hyperz.c index 5637be5e82b..ba686f31df2 100644 --- a/src/gallium/drivers/r300/r300_hyperz.c +++ b/src/gallium/drivers/r300/r300_hyperz.c @@ -117,8 +117,7 @@ static void r300_update_hyperz(struct r300_context* r300) struct pipe_framebuffer_state *fb = (struct pipe_framebuffer_state*)r300->fb_state.state; struct r300_dsa_state *dsa = r300->dsa_state.state; - struct r300_resource *zstex = - fb->zsbuf ? r300_resource(fb->zsbuf->texture) : NULL; + struct r300_resource *zstex = r300_resource(fb->zsbuf.texture); z->gb_z_peq_config = 0; z->zb_bw_cntl = 0; @@ -134,7 +133,7 @@ static void r300_update_hyperz(struct r300_context* r300) return; /* Set the size of ZMASK tiles. */ - if (zstex->tex.zcomp8x8[fb->zsbuf->u.tex.level]) { + if (zstex->tex.zcomp8x8[fb->zsbuf.u.tex.level]) { z->gb_z_peq_config |= R300_GB_Z_PEQ_CONFIG_Z_PEQ_SIZE_8_8; } diff --git a/src/gallium/drivers/r300/r300_state.c b/src/gallium/drivers/r300/r300_state.c index 655a53240b9..37ec700b359 100644 --- a/src/gallium/drivers/r300/r300_state.c +++ b/src/gallium/drivers/r300/r300_state.c @@ -566,7 +566,7 @@ static void r300_set_blend_color(struct pipe_context* pipe, state->state = *color; /* Save it, so that we can reuse it in set_fb_state */ c = *color; - cb = fb->nr_cbufs ? r300_get_nonnull_cb(fb, 0) : NULL; + cb = fb->nr_cbufs ? r300_get_nonnull_cb(r300, fb, 0) : NULL; /* The blend color is dependent on the colorbuffer format. */ if (cb) { @@ -816,7 +816,7 @@ static void r300_set_stencil_ref(struct pipe_context* pipe, r300_mark_atom_dirty(r300, &r300->dsa_state); } -static void r300_print_fb_surf_info(struct pipe_surface *surf, unsigned index, +static void r300_print_fb_surf_info(const struct pipe_surface *surf, unsigned index, const char *binding) { struct pipe_resource *tex = surf->texture; @@ -870,7 +870,7 @@ void r300_mark_fb_state_dirty(struct r300_context *r300, if (r300->cbzb_clear) r300->fb_state.size += 10; - else if (state->zsbuf) { + else if (state->zsbuf.texture) { r300->fb_state.size += 10; if (r300->hyperz_enabled) r300->fb_state.size += 8; @@ -911,22 +911,22 @@ r300_set_framebuffer_state(struct pipe_context* pipe, return; } - if (current_state->zsbuf && r300->zmask_in_use && !r300->locked_zbuffer) { + if (current_state->zsbuf.texture && r300->zmask_in_use && !r300->locked_zbuffer) { /* There is a zmask in use, what are we gonna do? */ - if (state->zsbuf) { - if (!pipe_surface_equal(current_state->zsbuf, state->zsbuf)) { + if (state->zsbuf.texture) { + if (!pipe_surface_equal(¤t_state->zsbuf, &state->zsbuf)) { /* Decompress the currently bound zbuffer before we bind another one. */ r300_decompress_zmask(r300); r300->hiz_in_use = false; } } else { /* We don't bind another zbuffer, so lock the current one. */ - pipe_surface_reference(&r300->locked_zbuffer, current_state->zsbuf); + pipe_surface_reference(&r300->locked_zbuffer, r300->fb_zsbuf); } } else if (r300->locked_zbuffer) { /* We have a locked zbuffer now, what are we gonna do? */ - if (state->zsbuf) { - if (!pipe_surface_equal(r300->locked_zbuffer, state->zsbuf)) { + if (state->zsbuf.texture) { + if (!pipe_surface_equal(r300->locked_zbuffer, &state->zsbuf)) { /* We are binding some other zbuffer, so decompress the locked one, * it gets unlocked automatically. */ r300_decompress_zmask_locked_unsafe(r300); @@ -937,23 +937,23 @@ r300_set_framebuffer_state(struct pipe_context* pipe, } } } - assert(state->zsbuf || (r300->locked_zbuffer && !unlock_zbuffer) || !r300->zmask_in_use); + assert(state->zsbuf.texture || (r300->locked_zbuffer && !unlock_zbuffer) || !r300->zmask_in_use); /* If zsbuf is set from NULL to non-NULL or vice versa.. */ - if (!!current_state->zsbuf != !!state->zsbuf) { + if (!!current_state->zsbuf.texture != !!state->zsbuf.texture) { r300_mark_atom_dirty(r300, &r300->dsa_state); } + util_framebuffer_init(pipe, state, r300->fb_cbufs, &r300->fb_zsbuf); util_copy_framebuffer_state(r300->fb_state.state, state); /* Remove trailing NULL colorbuffers. */ - while (current_state->nr_cbufs && !current_state->cbufs[current_state->nr_cbufs-1]) + while (current_state->nr_cbufs && !current_state->cbufs[current_state->nr_cbufs-1].texture) current_state->nr_cbufs--; /* Set whether CMASK can be used. */ r300->cmask_in_use = - state->nr_cbufs == 1 && state->cbufs[0] && - r300->screen->cmask_resource == state->cbufs[0]->texture; + state->nr_cbufs == 1 && r300->screen->cmask_resource == state->cbufs[0].texture; /* Need to reset clamping or colormask. */ r300_mark_atom_dirty(r300, &r300->blend_state); @@ -967,8 +967,8 @@ r300_set_framebuffer_state(struct pipe_context* pipe, r300_mark_fb_state_dirty(r300, R300_CHANGED_FB_STATE); - if (state->zsbuf) { - switch (util_format_get_blocksize(state->zsbuf->format)) { + if (state->zsbuf.texture) { + switch (util_format_get_blocksize(state->zsbuf.format)) { case 2: zbuffer_bpp = 16; break; @@ -1011,11 +1011,11 @@ r300_set_framebuffer_state(struct pipe_context* pipe, if (DBG_ON(r300, DBG_FB)) { fprintf(stderr, "r300: set_framebuffer_state:\n"); for (i = 0; i < state->nr_cbufs; i++) { - if (state->cbufs[i]) - r300_print_fb_surf_info(state->cbufs[i], i, "CB"); + if (state->cbufs[i].texture) + r300_print_fb_surf_info(&state->cbufs[i], i, "CB"); } - if (state->zsbuf) { - r300_print_fb_surf_info(state->zsbuf, 0, "ZB"); + if (state->zsbuf.texture) { + r300_print_fb_surf_info(&state->zsbuf, 0, "ZB"); } } } diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c index 67465b2374c..cd98fb40265 100644 --- a/src/gallium/drivers/r600/evergreen_compute.c +++ b/src/gallium/drivers/r600/evergreen_compute.c @@ -93,13 +93,15 @@ static void evergreen_set_rat(struct r600_pipe_compute *pipe, /* Create the RAT surface */ memset(&rat_templ, 0, sizeof(rat_templ)); rat_templ.format = PIPE_FORMAT_R32_UINT; + rat_templ.texture = &bo->b.b; rat_templ.u.tex.level = 0; rat_templ.u.tex.first_layer = 0; rat_templ.u.tex.last_layer = 0; /* Add the RAT the list of color buffers. Drop the old buffer first. */ - pipe_surface_reference(&pipe->ctx->framebuffer.state.cbufs[id], NULL); - pipe->ctx->framebuffer.state.cbufs[id] = pipe->ctx->b.b.create_surface( + pipe->ctx->framebuffer.state.cbufs[id] = rat_templ; + pipe_surface_unref_no_context(&pipe->ctx->framebuffer.fb_cbufs[id]); + pipe->ctx->framebuffer.fb_cbufs[id] = pipe->ctx->b.b.create_surface( (struct pipe_context *)pipe->ctx, (struct pipe_resource *)bo, &rat_templ); @@ -113,7 +115,7 @@ static void evergreen_set_rat(struct r600_pipe_compute *pipe, * of this driver. */ pipe->ctx->compute_cb_target_mask |= (0xf << (id * 4)); - surf = (struct r600_surface*)pipe->ctx->framebuffer.state.cbufs[id]; + surf = (struct r600_surface*)pipe->ctx->framebuffer.fb_cbufs[id]; evergreen_init_color_surface_rat(rctx, surf); } diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c index 7587fd45bb9..492bd05e8e0 100644 --- a/src/gallium/drivers/r600/evergreen_state.c +++ b/src/gallium/drivers/r600/evergreen_state.c @@ -1462,17 +1462,18 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx, R600_CONTEXT_FLUSH_AND_INV_DB_META | R600_CONTEXT_INV_TEX_CACHE; + util_framebuffer_init(ctx, state, rctx->framebuffer.fb_cbufs, &rctx->framebuffer.fb_zsbuf); util_copy_framebuffer_state(&rctx->framebuffer.state, state); /* Colorbuffers. */ rctx->framebuffer.export_16bpc = state->nr_cbufs != 0; - rctx->framebuffer.cb0_is_integer = state->nr_cbufs && state->cbufs[0] && - util_format_is_pure_integer(state->cbufs[0]->format); + rctx->framebuffer.cb0_is_integer = state->nr_cbufs && state->cbufs[0].texture && + util_format_is_pure_integer(state->cbufs[0].format); rctx->framebuffer.compressed_cb_mask = 0; rctx->framebuffer.nr_samples = util_framebuffer_get_num_samples(state); for (i = 0; i < state->nr_cbufs; i++) { - surf = (struct r600_surface*)state->cbufs[i]; + surf = (struct r600_surface*)rctx->framebuffer.fb_cbufs[i]; if (!surf) continue; @@ -1480,7 +1481,7 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx, rtex = (struct r600_texture*)surf->base.texture; - r600_context_add_resource_size(ctx, state->cbufs[i]->texture); + r600_context_add_resource_size(ctx, state->cbufs[i].texture); if (!surf->color_initialized) { evergreen_init_color_surface(rctx, surf); @@ -1501,7 +1502,7 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx, bool alphatest_bypass = false; bool export_16bpc = true; - surf = (struct r600_surface*)state->cbufs[0]; + surf = (struct r600_surface*)rctx->framebuffer.fb_cbufs[0]; if (surf) { alphatest_bypass = surf->alphatest_bypass; export_16bpc = surf->export_16bpc; @@ -1518,17 +1519,17 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx, } /* ZS buffer. */ - if (state->zsbuf) { - surf = (struct r600_surface*)state->zsbuf; + if (state->zsbuf.texture) { + surf = (struct r600_surface*)rctx->framebuffer.fb_zsbuf; - r600_context_add_resource_size(ctx, state->zsbuf->texture); + r600_context_add_resource_size(ctx, state->zsbuf.texture); if (!surf->depth_initialized) { evergreen_init_depth_surface(rctx, surf); } - if (state->zsbuf->format != rctx->poly_offset_state.zs_format) { - rctx->poly_offset_state.zs_format = state->zsbuf->format; + if (state->zsbuf.format != rctx->poly_offset_state.zs_format) { + rctx->poly_offset_state.zs_format = state->zsbuf.format; r600_mark_atom_dirty(rctx, &rctx->poly_offset_state.atom); } @@ -1580,7 +1581,7 @@ static void evergreen_set_framebuffer_state(struct pipe_context *ctx, rctx->framebuffer.atom.num_dw += (12 - state->nr_cbufs) * 3; /* ZS buffer. */ - if (state->zsbuf) { + if (state->zsbuf.texture) { rctx->framebuffer.atom.num_dw += 24; rctx->framebuffer.atom.num_dw += 2; } else { @@ -1853,7 +1854,7 @@ static void evergreen_emit_framebuffer_state(struct r600_context *rctx, struct r for (i = 0; i < nr_cbufs; i++) { unsigned reloc, cmask_reloc; - cb = (struct r600_surface*)state->cbufs[i]; + cb = (struct r600_surface*)rctx->framebuffer.fb_cbufs[i]; if (!cb) { radeon_set_context_reg(cs, R_028C70_CB_COLOR0_INFO + i * 0x3C, S_028C70_FORMAT(V_028C70_COLOR_INVALID)); @@ -1904,7 +1905,7 @@ static void evergreen_emit_framebuffer_state(struct r600_context *rctx, struct r radeon_emit(cs, reloc); } /* set CB_COLOR1_INFO for possible dual-src blending */ - if (rctx->framebuffer.dual_src_blend && i == 1 && state->cbufs[0]) { + if (rctx->framebuffer.dual_src_blend && i == 1 && state->cbufs[0].texture) { radeon_set_context_reg(cs, R_028C70_CB_COLOR0_INFO + 1 * 0x3C, cb->cb_color_info | tex->cb_color_info); i++; @@ -1917,11 +1918,11 @@ static void evergreen_emit_framebuffer_state(struct r600_context *rctx, struct r radeon_set_context_reg(cs, R_028E50_CB_COLOR8_INFO + (i - 8) * 0x1C, 0); /* ZS buffer. */ - if (state->zsbuf) { - struct r600_surface *zb = (struct r600_surface*)state->zsbuf; + if (state->zsbuf.texture) { + struct r600_surface *zb = (struct r600_surface*)rctx->framebuffer.fb_zsbuf; unsigned reloc = radeon_add_to_buffer_list(&rctx->b, &rctx->b.gfx, - (struct r600_resource*)state->zsbuf->texture, + (struct r600_resource*)state->zsbuf.texture, RADEON_USAGE_READWRITE | (zb->base.texture->nr_samples > 1 ? RADEON_PRIO_DEPTH_BUFFER_MSAA : diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c index 31aaa769c22..b4a27c09108 100644 --- a/src/gallium/drivers/r600/r600_blit.c +++ b/src/gallium/drivers/r600/r600_blit.c @@ -461,6 +461,130 @@ static bool r600_decompress_subresource(struct pipe_context *ctx, return true; } +/* FAST COLOR CLEAR */ + +static void evergreen_set_clear_color(struct r600_texture *rtex, + enum pipe_format surface_format, + const union pipe_color_union *color) +{ + union util_color uc; + + memset(&uc, 0, sizeof(uc)); + + if (rtex->surface.bpe == 16) { + /* DCC fast clear only: + * CLEAR_WORD0 = R = G = B + * CLEAR_WORD1 = A + */ + assert(color->ui[0] == color->ui[1] && + color->ui[0] == color->ui[2]); + uc.ui[0] = color->ui[0]; + uc.ui[1] = color->ui[3]; + } else { + util_pack_color_union(surface_format, &uc, color); + } + + memcpy(rtex->color_clear_value, &uc, 2 * sizeof(uint32_t)); +} + +static void +evergreen_do_fast_color_clear(struct r600_context *rctx, + struct pipe_framebuffer_state *fb, + struct r600_atom *fb_state, + unsigned *buffers, uint8_t *dirty_cbufs, + const union pipe_color_union *color) +{ + int i; + + /* This function is broken in BE, so just disable this path for now */ +#if UTIL_ARCH_BIG_ENDIAN + return; +#endif + + if (rctx->b.render_cond) + return; + + for (i = 0; i < fb->nr_cbufs; i++) { + struct r600_texture *tex; + unsigned clear_bit = PIPE_CLEAR_COLOR0 << i; + + if (!fb->cbufs[i].texture) + continue; + + /* if this colorbuffer is not being cleared */ + if (!(*buffers & clear_bit)) + continue; + + tex = (struct r600_texture *)rctx->framebuffer.fb_cbufs[i]->texture; + + /* the clear is allowed if all layers are bound */ + if (fb->cbufs[i].u.tex.first_layer != 0 || + fb->cbufs[i].u.tex.last_layer != util_max_layer(&tex->resource.b.b, 0)) { + continue; + } + + /* cannot clear mipmapped textures */ + if (fb->cbufs[i].texture->last_level != 0) { + continue; + } + + /* only supported on tiled surfaces */ + if (tex->surface.is_linear) { + continue; + } + + /* shared textures can't use fast clear without an explicit flush, + * because there is no way to communicate the clear color among + * all clients + */ + if (tex->resource.b.is_shared && + !(tex->resource.external_usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH)) + continue; + + /* Use a slow clear for small surfaces where the cost of + * the eliminate pass can be higher than the benefit of fast + * clear. AMDGPU-pro does this, but the numbers may differ. + * + * This helps on both dGPUs and APUs, even small ones. + */ + if (tex->resource.b.b.nr_samples <= 1 && + tex->resource.b.b.width0 * tex->resource.b.b.height0 <= 300 * 300) + continue; + + { + /* 128-bit formats are unusupported */ + if (tex->surface.bpe > 8) { + continue; + } + + /* ensure CMASK is enabled */ + r600_texture_alloc_cmask_separate(rctx->b.screen, tex); + if (tex->cmask.size == 0) { + continue; + } + + /* Do the fast clear. */ + rctx->b.clear_buffer(&rctx->b.b, &tex->cmask_buffer->b.b, + tex->cmask.offset, tex->cmask.size, 0, + R600_COHERENCY_CB_META); + + bool need_compressed_update = !tex->dirty_level_mask; + + tex->dirty_level_mask |= 1 << fb->cbufs[i].u.tex.level; + + if (need_compressed_update) + p_atomic_inc(&rctx->b.screen->compressed_colortex_counter); + } + + evergreen_set_clear_color(tex, fb->cbufs[i].format, color); + + if (dirty_cbufs) + *dirty_cbufs |= 1 << i; + rctx->b.set_atom_dirty(&rctx->b, fb_state, true); + *buffers &= ~clear_bit; + } +} + static void r600_clear(struct pipe_context *ctx, unsigned buffers, const struct pipe_scissor_state *scissor_state, const union pipe_color_union *color, @@ -470,7 +594,7 @@ static void r600_clear(struct pipe_context *ctx, unsigned buffers, struct pipe_framebuffer_state *fb = &rctx->framebuffer.state; if (buffers & PIPE_CLEAR_COLOR && rctx->b.gfx_level >= EVERGREEN) { - evergreen_do_fast_color_clear(&rctx->b, fb, &rctx->framebuffer.atom, + evergreen_do_fast_color_clear(rctx, fb, &rctx->framebuffer.atom, &buffers, NULL, color); if (!buffers) return; /* all buffers have been fast cleared */ @@ -487,29 +611,29 @@ static void r600_clear(struct pipe_context *ctx, unsigned buffers, if (!(buffers & (PIPE_CLEAR_COLOR0 << i))) continue; - if (!fb->cbufs[i]) + if (!fb->cbufs[i].texture) continue; - tex = (struct r600_texture *)fb->cbufs[i]->texture; + tex = (struct r600_texture *)fb->cbufs[i].texture; if (tex->fmask.size == 0) - tex->dirty_level_mask &= ~(1 << fb->cbufs[i]->u.tex.level); + tex->dirty_level_mask &= ~(1 << fb->cbufs[i].u.tex.level); } } /* if hyperz enabled just clear hyperz */ - if (fb->zsbuf && (buffers & PIPE_CLEAR_DEPTH)) { + if (fb->zsbuf.texture && (buffers & PIPE_CLEAR_DEPTH)) { struct r600_texture *rtex; - unsigned level = fb->zsbuf->u.tex.level; + unsigned level = fb->zsbuf.u.tex.level; - rtex = (struct r600_texture*)fb->zsbuf->texture; + rtex = (struct r600_texture*)fb->zsbuf.texture; /* We can't use hyperz fast clear if each slice of a texture * array are clear to different value. To simplify code just * disable fast clear for texture array. */ if (r600_htile_enabled(rtex, level) && - fb->zsbuf->u.tex.first_layer == 0 && - fb->zsbuf->u.tex.last_layer == util_max_layer(&rtex->resource.b.b, level)) { + fb->zsbuf.u.tex.first_layer == 0 && + fb->zsbuf.u.tex.last_layer == util_max_layer(&rtex->resource.b.b, level)) { if (rtex->depth_clear_value != depth) { rtex->depth_clear_value = depth; r600_mark_atom_dirty(rctx, &rctx->db_state.atom); diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index d97cb28ba49..a0e868ac362 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -74,6 +74,7 @@ static void r600_destroy_context(struct pipe_context *context) if (rctx->custom_blend_fastclear) { rctx->b.b.delete_blend_state(&rctx->b.b, rctx->custom_blend_fastclear); } + util_framebuffer_init(context, NULL, rctx->framebuffer.fb_cbufs, &rctx->framebuffer.fb_zsbuf); util_unreference_framebuffer_state(&rctx->framebuffer.state); if (rctx->gs_rings.gsvs_ring.buffer) diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h index 104d5bafb7f..466685a97f7 100644 --- a/src/gallium/drivers/r600/r600_pipe.h +++ b/src/gallium/drivers/r600/r600_pipe.h @@ -17,6 +17,7 @@ #include "util/list.h" #include "util/u_transfer.h" #include "util/u_memory.h" +#include "util/u_framebuffer.h" #include "tgsi/tgsi_scan.h" @@ -189,6 +190,7 @@ struct r600_cs_shader_state { struct r600_framebuffer { struct r600_atom atom; + PIPE_FB_SURFACES; //STOP USING THIS struct pipe_framebuffer_state state; unsigned compressed_cb_mask; unsigned nr_samples; diff --git a/src/gallium/drivers/r600/r600_pipe_common.h b/src/gallium/drivers/r600/r600_pipe_common.h index e788d66fdf7..1705df9d0ff 100644 --- a/src/gallium/drivers/r600/r600_pipe_common.h +++ b/src/gallium/drivers/r600/r600_pipe_common.h @@ -752,11 +752,8 @@ struct pipe_surface *r600_create_surface_custom(struct pipe_context *pipe, const struct pipe_surface *templ, unsigned width0, unsigned height0); unsigned r600_translate_colorswap(enum pipe_format format, bool do_endian_swap); -void evergreen_do_fast_color_clear(struct r600_common_context *rctx, - struct pipe_framebuffer_state *fb, - struct r600_atom *fb_state, - unsigned *buffers, uint8_t *dirty_cbufs, - const union pipe_color_union *color); +void r600_texture_alloc_cmask_separate(struct r600_common_screen *rscreen, + struct r600_texture *rtex); void r600_init_screen_texture_functions(struct r600_common_screen *rscreen); void r600_init_context_texture_functions(struct r600_common_context *rctx); void eg_resource_alloc_immed(struct r600_common_screen *rscreen, diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c index ba95c66352f..7003610d256 100644 --- a/src/gallium/drivers/r600/r600_state.c +++ b/src/gallium/drivers/r600/r600_state.c @@ -1094,16 +1094,17 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx, R600_CONTEXT_INV_TEX_CACHE; /* Set the new state. */ + util_framebuffer_init(ctx, state, rctx->framebuffer.fb_cbufs, &rctx->framebuffer.fb_zsbuf); util_copy_framebuffer_state(&rctx->framebuffer.state, state); rctx->framebuffer.export_16bpc = state->nr_cbufs != 0; - rctx->framebuffer.cb0_is_integer = state->nr_cbufs && state->cbufs[0] && - util_format_is_pure_integer(state->cbufs[0]->format); + rctx->framebuffer.cb0_is_integer = state->nr_cbufs && state->cbufs[0].texture && + util_format_is_pure_integer(state->cbufs[0].format); rctx->framebuffer.compressed_cb_mask = 0; rctx->framebuffer.is_msaa_resolve = state->nr_cbufs == 2 && - state->cbufs[0] && state->cbufs[1] && - state->cbufs[0]->texture->nr_samples > 1 && - state->cbufs[1]->texture->nr_samples <= 1; + state->cbufs[0].texture && state->cbufs[1].texture && + state->cbufs[0].texture->nr_samples > 1 && + state->cbufs[1].texture->nr_samples <= 1; rctx->framebuffer.nr_samples = util_framebuffer_get_num_samples(state); /* Colorbuffers. */ @@ -1113,12 +1114,12 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx, rctx->framebuffer.is_msaa_resolve && i == 1; - surf = (struct r600_surface*)state->cbufs[i]; + surf = (struct r600_surface*)rctx->framebuffer.fb_cbufs[i]; if (!surf) continue; rtex = (struct r600_texture*)surf->base.texture; - r600_context_add_resource_size(ctx, state->cbufs[i]->texture); + r600_context_add_resource_size(ctx, state->cbufs[i].texture); target_mask |= (0xf << (i * 4)); @@ -1144,7 +1145,7 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx, if (state->nr_cbufs) { bool alphatest_bypass = false; - surf = (struct r600_surface*)state->cbufs[0]; + surf = (struct r600_surface*)rctx->framebuffer.fb_cbufs[0]; if (surf) { alphatest_bypass = surf->alphatest_bypass; } @@ -1156,17 +1157,17 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx, } /* ZS buffer. */ - if (state->zsbuf) { - surf = (struct r600_surface*)state->zsbuf; + if (state->zsbuf.texture) { + surf = (struct r600_surface*)rctx->framebuffer.fb_zsbuf; - r600_context_add_resource_size(ctx, state->zsbuf->texture); + r600_context_add_resource_size(ctx, state->zsbuf.texture); if (!surf->depth_initialized) { r600_init_depth_surface(rctx, surf); } - if (state->zsbuf->format != rctx->poly_offset_state.zs_format) { - rctx->poly_offset_state.zs_format = state->zsbuf->format; + if (state->zsbuf.format != rctx->poly_offset_state.zs_format) { + rctx->poly_offset_state.zs_format = state->zsbuf.format; r600_mark_atom_dirty(rctx, &rctx->poly_offset_state.atom); } @@ -1201,7 +1202,7 @@ static void r600_set_framebuffer_state(struct pipe_context *ctx, rctx->framebuffer.atom.num_dw += 15 * rctx->framebuffer.state.nr_cbufs; rctx->framebuffer.atom.num_dw += 3 * (2 + rctx->framebuffer.state.nr_cbufs); } - if (rctx->framebuffer.state.zsbuf) { + if (rctx->framebuffer.state.zsbuf.texture) { rctx->framebuffer.atom.num_dw += 16; } else { rctx->framebuffer.atom.num_dw += 3; @@ -1344,7 +1345,7 @@ static void r600_emit_framebuffer_state(struct r600_context *rctx, struct r600_a struct radeon_cmdbuf *cs = &rctx->b.gfx.cs; struct pipe_framebuffer_state *state = &rctx->framebuffer.state; unsigned nr_cbufs = state->nr_cbufs; - struct r600_surface **cb = (struct r600_surface**)&state->cbufs[0]; + struct r600_surface **cb = (struct r600_surface**)&rctx->framebuffer.fb_cbufs[0]; unsigned i, sbu = 0; /* Colorbuffers. */ @@ -1434,11 +1435,11 @@ static void r600_emit_framebuffer_state(struct r600_context *rctx, struct r600_a } /* Zbuffer. */ - if (state->zsbuf) { - struct r600_surface *surf = (struct r600_surface*)state->zsbuf; + if (state->zsbuf.texture) { + struct r600_surface *surf = (struct r600_surface*)rctx->framebuffer.fb_zsbuf; unsigned reloc = radeon_add_to_buffer_list(&rctx->b, &rctx->b.gfx, - (struct r600_resource*)state->zsbuf->texture, + (struct r600_resource*)state->zsbuf.texture, RADEON_USAGE_READWRITE | (surf->base.texture->nr_samples > 1 ? RADEON_PRIO_DEPTH_BUFFER_MSAA : diff --git a/src/gallium/drivers/r600/r600_state_common.c b/src/gallium/drivers/r600/r600_state_common.c index 7e0682883d5..47b31e62edf 100644 --- a/src/gallium/drivers/r600/r600_state_common.c +++ b/src/gallium/drivers/r600/r600_state_common.c @@ -2520,8 +2520,8 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info if (rctx->framebuffer.do_update_surf_dirtiness) { /* Set the depth buffer as dirty. */ - if (rctx->framebuffer.state.zsbuf) { - struct pipe_surface *surf = rctx->framebuffer.state.zsbuf; + if (rctx->framebuffer.state.zsbuf.texture) { + struct pipe_surface *surf = &rctx->framebuffer.state.zsbuf; struct r600_texture *rtex = (struct r600_texture *)surf->texture; rtex->dirty_level_mask |= 1 << surf->u.tex.level; @@ -2536,7 +2536,7 @@ static void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info do { unsigned i = u_bit_scan(&mask); - surf = rctx->framebuffer.state.cbufs[i]; + surf = rctx->framebuffer.fb_cbufs[i]; rtex = (struct r600_texture*)surf->texture; rtex->dirty_level_mask |= 1 << surf->u.tex.level; diff --git a/src/gallium/drivers/r600/r600_texture.c b/src/gallium/drivers/r600/r600_texture.c index 1fe2fb946ac..414d901b45a 100644 --- a/src/gallium/drivers/r600/r600_texture.c +++ b/src/gallium/drivers/r600/r600_texture.c @@ -692,8 +692,8 @@ static void r600_texture_allocate_cmask(struct r600_common_screen *rscreen, rtex->cb_color_info |= EG_S_028C70_FAST_CLEAR(1); } -static void r600_texture_alloc_cmask_separate(struct r600_common_screen *rscreen, - struct r600_texture *rtex) +void r600_texture_alloc_cmask_separate(struct r600_common_screen *rscreen, + struct r600_texture *rtex) { if (rtex->cmask_buffer) return; @@ -1610,129 +1610,6 @@ unsigned r600_translate_colorswap(enum pipe_format format, bool do_endian_swap) return ~0U; } -/* FAST COLOR CLEAR */ - -static void evergreen_set_clear_color(struct r600_texture *rtex, - enum pipe_format surface_format, - const union pipe_color_union *color) -{ - union util_color uc; - - memset(&uc, 0, sizeof(uc)); - - if (rtex->surface.bpe == 16) { - /* DCC fast clear only: - * CLEAR_WORD0 = R = G = B - * CLEAR_WORD1 = A - */ - assert(color->ui[0] == color->ui[1] && - color->ui[0] == color->ui[2]); - uc.ui[0] = color->ui[0]; - uc.ui[1] = color->ui[3]; - } else { - util_pack_color_union(surface_format, &uc, color); - } - - memcpy(rtex->color_clear_value, &uc, 2 * sizeof(uint32_t)); -} - -void evergreen_do_fast_color_clear(struct r600_common_context *rctx, - struct pipe_framebuffer_state *fb, - struct r600_atom *fb_state, - unsigned *buffers, uint8_t *dirty_cbufs, - const union pipe_color_union *color) -{ - int i; - - /* This function is broken in BE, so just disable this path for now */ -#if UTIL_ARCH_BIG_ENDIAN - return; -#endif - - if (rctx->render_cond) - return; - - for (i = 0; i < fb->nr_cbufs; i++) { - struct r600_texture *tex; - unsigned clear_bit = PIPE_CLEAR_COLOR0 << i; - - if (!fb->cbufs[i]) - continue; - - /* if this colorbuffer is not being cleared */ - if (!(*buffers & clear_bit)) - continue; - - tex = (struct r600_texture *)fb->cbufs[i]->texture; - - /* the clear is allowed if all layers are bound */ - if (fb->cbufs[i]->u.tex.first_layer != 0 || - fb->cbufs[i]->u.tex.last_layer != util_max_layer(&tex->resource.b.b, 0)) { - continue; - } - - /* cannot clear mipmapped textures */ - if (fb->cbufs[i]->texture->last_level != 0) { - continue; - } - - /* only supported on tiled surfaces */ - if (tex->surface.is_linear) { - continue; - } - - /* shared textures can't use fast clear without an explicit flush, - * because there is no way to communicate the clear color among - * all clients - */ - if (tex->resource.b.is_shared && - !(tex->resource.external_usage & PIPE_HANDLE_USAGE_EXPLICIT_FLUSH)) - continue; - - /* Use a slow clear for small surfaces where the cost of - * the eliminate pass can be higher than the benefit of fast - * clear. AMDGPU-pro does this, but the numbers may differ. - * - * This helps on both dGPUs and APUs, even small ones. - */ - if (tex->resource.b.b.nr_samples <= 1 && - tex->resource.b.b.width0 * tex->resource.b.b.height0 <= 300 * 300) - continue; - - { - /* 128-bit formats are unusupported */ - if (tex->surface.bpe > 8) { - continue; - } - - /* ensure CMASK is enabled */ - r600_texture_alloc_cmask_separate(rctx->screen, tex); - if (tex->cmask.size == 0) { - continue; - } - - /* Do the fast clear. */ - rctx->clear_buffer(&rctx->b, &tex->cmask_buffer->b.b, - tex->cmask.offset, tex->cmask.size, 0, - R600_COHERENCY_CB_META); - - bool need_compressed_update = !tex->dirty_level_mask; - - tex->dirty_level_mask |= 1 << fb->cbufs[i]->u.tex.level; - - if (need_compressed_update) - p_atomic_inc(&rctx->screen->compressed_colortex_counter); - } - - evergreen_set_clear_color(tex, fb->cbufs[i]->format, color); - - if (dirty_cbufs) - *dirty_cbufs |= 1 << i; - rctx->set_atom_dirty(rctx, fb_state, true); - *buffers &= ~clear_bit; - } -} - static struct pipe_memory_object * r600_memobj_from_handle(struct pipe_screen *screen, struct winsys_handle *whandle, diff --git a/src/gallium/drivers/radeonsi/si_barrier.c b/src/gallium/drivers/radeonsi/si_barrier.c index 280805cb605..52d6a4238e7 100644 --- a/src/gallium/drivers/radeonsi/si_barrier.c +++ b/src/gallium/drivers/radeonsi/si_barrier.c @@ -731,7 +731,7 @@ static void si_set_sampler_depth_decompress_mask(struct si_context *sctx, struct void si_fb_barrier_before_rendering(struct si_context *sctx) { /* Wait for all shaders because all image loads must finish before CB/DB can write there. */ - if (sctx->framebuffer.state.nr_cbufs || sctx->framebuffer.state.zsbuf) { + if (sctx->framebuffer.state.nr_cbufs || sctx->framebuffer.state.zsbuf.texture) { sctx->barrier_flags |= SI_BARRIER_SYNC_CS | SI_BARRIER_SYNC_PS; si_mark_atom_dirty(sctx, &sctx->atoms.s.barrier); } @@ -743,8 +743,8 @@ void si_fb_barrier_after_rendering(struct si_context *sctx, unsigned flags) /* Setting dirty_level_mask should ignore SI_FB_BARRIER_SYNC_* because it triggers * decompression, which is not syncing. */ - if (sctx->framebuffer.state.zsbuf) { - struct pipe_surface *surf = sctx->framebuffer.state.zsbuf; + if (sctx->framebuffer.state.zsbuf.texture) { + struct pipe_surface *surf = &sctx->framebuffer.state.zsbuf; struct si_texture *tex = (struct si_texture *)surf->texture; tex->dirty_level_mask |= 1 << surf->u.tex.level; @@ -758,7 +758,7 @@ void si_fb_barrier_after_rendering(struct si_context *sctx, unsigned flags) unsigned compressed_cb_mask = sctx->framebuffer.compressed_cb_mask; while (compressed_cb_mask) { unsigned i = u_bit_scan(&compressed_cb_mask); - struct pipe_surface *surf = sctx->framebuffer.state.cbufs[i]; + struct pipe_surface *surf = &sctx->framebuffer.state.cbufs[i]; struct si_texture *tex = (struct si_texture *)surf->texture; if (tex->surface.fmask_offset) { @@ -780,7 +780,7 @@ void si_fb_barrier_after_rendering(struct si_context *sctx, unsigned flags) } } - if (flags & SI_FB_BARRIER_SYNC_DB && sctx->framebuffer.state.zsbuf) { + if (flags & SI_FB_BARRIER_SYNC_DB && sctx->framebuffer.state.zsbuf.texture) { /* DB caches are flushed on demand (using si_decompress_textures) except the cases below. */ if (sctx->gfx_level >= GFX12) { si_make_DB_shader_coherent(sctx, sctx->framebuffer.nr_samples, true, false); @@ -792,7 +792,7 @@ void si_fb_barrier_after_rendering(struct si_context *sctx, unsigned flags) */ si_make_DB_shader_coherent(sctx, 1, false, sctx->framebuffer.DB_has_shader_readable_metadata); } else if (sctx->screen->info.family == CHIP_NAVI33) { - struct si_surface *old_zsurf = (struct si_surface *)sctx->framebuffer.state.zsbuf; + struct si_surface *old_zsurf = (struct si_surface *)sctx->framebuffer.fb_zsbuf; struct si_texture *old_ztex = (struct si_texture *)old_zsurf->base.texture; if (old_ztex->upgraded_depth) { diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index ec6f2393a25..3b8523b5eaf 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -641,16 +641,14 @@ static void si_check_render_feedback_texture(struct si_context *sctx, struct si_ return; for (unsigned j = 0; j < sctx->framebuffer.state.nr_cbufs; ++j) { - struct si_surface *surf; + struct pipe_surface *surf = &sctx->framebuffer.state.cbufs[j]; - if (!sctx->framebuffer.state.cbufs[j]) + if (!sctx->framebuffer.state.cbufs[j].texture) continue; - surf = (struct si_surface *)sctx->framebuffer.state.cbufs[j]; - - if (tex == (struct si_texture *)surf->base.texture && surf->base.u.tex.level >= first_level && - surf->base.u.tex.level <= last_level && surf->base.u.tex.first_layer <= last_layer && - surf->base.u.tex.last_layer >= first_layer) { + if (tex == (struct si_texture *)surf->texture && surf->u.tex.level >= first_level && + surf->u.tex.level <= last_level && surf->u.tex.first_layer <= last_layer && + surf->u.tex.last_layer >= first_layer) { render_feedback = true; break; } @@ -868,7 +866,7 @@ void gfx6_decompress_textures(struct si_context *sctx, unsigned shader_mask) si_decompress_resident_images(sctx); if (sctx->ps_uses_fbfetch) { - struct pipe_surface *cb0 = sctx->framebuffer.state.cbufs[0]; + struct pipe_surface *cb0 = &sctx->framebuffer.state.cbufs[0]; si_decompress_color_texture(sctx, (struct si_texture *)cb0->texture, cb0->u.tex.first_layer, cb0->u.tex.last_layer, false); } @@ -932,8 +930,8 @@ void si_decompress_subresource(struct pipe_context *ctx, struct pipe_resource *t * source, make sure the decompression pass is invoked * by dirtying the framebuffer. */ - if (sctx->framebuffer.state.zsbuf && sctx->framebuffer.state.zsbuf->u.tex.level == level && - sctx->framebuffer.state.zsbuf->texture == tex) + if (sctx->framebuffer.state.zsbuf.u.tex.level == level && + sctx->framebuffer.state.zsbuf.texture == tex) si_fb_barrier_after_rendering(sctx, SI_FB_BARRIER_SYNC_DB); si_decompress_depth(sctx, stex, planes, level, level, first_layer, last_layer); @@ -944,9 +942,8 @@ void si_decompress_subresource(struct pipe_context *ctx, struct pipe_resource *t * by dirtying the framebuffer. */ for (unsigned i = 0; i < sctx->framebuffer.state.nr_cbufs; i++) { - if (sctx->framebuffer.state.cbufs[i] && - sctx->framebuffer.state.cbufs[i]->u.tex.level == level && - sctx->framebuffer.state.cbufs[i]->texture == tex) { + if (sctx->framebuffer.state.cbufs[i].u.tex.level == level && + sctx->framebuffer.state.cbufs[i].texture == tex) { si_fb_barrier_after_rendering(sctx, SI_FB_BARRIER_SYNC_CB); break; } diff --git a/src/gallium/drivers/radeonsi/si_clear.c b/src/gallium/drivers/radeonsi/si_clear.c index 5c1390db2d8..af28fdb0275 100644 --- a/src/gallium/drivers/radeonsi/si_clear.c +++ b/src/gallium/drivers/radeonsi/si_clear.c @@ -660,13 +660,13 @@ static void si_fast_clear(struct si_context *sctx, unsigned *buffers, while (color_buffer_mask) { unsigned i = u_bit_scan(&color_buffer_mask); - struct si_texture *tex = (struct si_texture *)fb->cbufs[i]->texture; - unsigned level = fb->cbufs[i]->u.tex.level; + struct si_texture *tex = (struct si_texture *)fb->cbufs[i].texture; + unsigned level = fb->cbufs[i].u.tex.level; unsigned num_layers = util_num_layers(&tex->buffer.b.b, level); /* the clear is allowed if all layers are bound */ - if (fb->cbufs[i]->u.tex.first_layer != 0 || - fb->cbufs[i]->u.tex.last_layer != num_layers - 1) { + if (fb->cbufs[i].u.tex.first_layer != 0 || + fb->cbufs[i].u.tex.last_layer != num_layers - 1) { continue; } @@ -709,12 +709,12 @@ static void si_fast_clear(struct si_context *sctx, unsigned *buffers, continue; if (sctx->gfx_level >= GFX11) { - if (!gfx11_get_dcc_clear_parameters(sctx->screen, tex, level, fb->cbufs[i]->format, + if (!gfx11_get_dcc_clear_parameters(sctx->screen, tex, level, fb->cbufs[i].format, color, &reset_value, true)) continue; } else { if (!gfx8_get_dcc_clear_parameters(sctx->screen, tex->buffer.b.b.format, - fb->cbufs[i]->format, color, &reset_value, + fb->cbufs[i].format, color, &reset_value, &eliminate_needed)) continue; } @@ -761,7 +761,7 @@ static void si_fast_clear(struct si_context *sctx, unsigned *buffers, if (num_clears) memmove(&info[1], &info[0], sizeof(info[0]) * num_clears); - si_init_clear_image_dcc_single(&info[0], tex, level, fb->cbufs[i]->format, + si_init_clear_image_dcc_single(&info[0], tex, level, fb->cbufs[i].format, color); num_clears++; } @@ -885,21 +885,20 @@ static void si_fast_clear(struct si_context *sctx, unsigned *buffers, /* There are no clear color registers on GFX11. */ assert(sctx->gfx_level < GFX11); - if (si_set_clear_color(tex, fb->cbufs[i]->format, color) || need_dirtying_fb) { + if (si_set_clear_color(tex, fb->cbufs[i].format, color) || need_dirtying_fb) { sctx->framebuffer.dirty_cbufs |= 1 << i; si_mark_atom_dirty(sctx, &sctx->atoms.s.framebuffer); } } /* Depth/stencil clears. */ - struct pipe_surface *zsbuf = fb->zsbuf; - struct si_texture *zstex = zsbuf ? (struct si_texture *)zsbuf->texture : NULL; - unsigned zs_num_layers = zstex ? util_num_layers(&zstex->buffer.b.b, zsbuf->u.tex.level) : 0; + struct si_texture *zstex = (struct si_texture *)fb->zsbuf.texture; + unsigned zs_num_layers = zstex ? util_num_layers(&zstex->buffer.b.b, fb->zsbuf.u.tex.level) : 0; - if (zstex && zsbuf->u.tex.first_layer == 0 && - zsbuf->u.tex.last_layer == zs_num_layers - 1 && - si_htile_enabled(zstex, zsbuf->u.tex.level, PIPE_MASK_ZS)) { - unsigned level = zsbuf->u.tex.level; + if (zstex && fb->zsbuf.u.tex.first_layer == 0 && + fb->zsbuf.u.tex.last_layer == zs_num_layers - 1 && + si_htile_enabled(zstex, fb->zsbuf.u.tex.level, PIPE_MASK_ZS)) { + unsigned level = fb->zsbuf.u.tex.level; bool update_db_depth_clear = false; bool update_db_stencil_clear = false; bool fb_too_small = num_pixels * zs_num_layers <= 512 * 512; @@ -915,8 +914,8 @@ static void si_fast_clear(struct si_context *sctx, unsigned *buffers, * The clear isn't just memset. It still reads HTILE and decides what to do based on that. * We need to decompress fully, so that HTILE doesn't contain any compression flags. */ - si_decompress_subresource(&sctx->b, zsbuf->texture, PIPE_MASK_ZS, 0, 0, - util_max_layer(zsbuf->texture, 0), false); + si_decompress_subresource(&sctx->b, fb->zsbuf.texture, PIPE_MASK_ZS, 0, 0, + util_max_layer(fb->zsbuf.texture, 0), false); /* Enable TC-compatible HTILE. */ zstex->enable_tc_compatible_htile_next_clear = false; @@ -1067,7 +1066,7 @@ static void si_fb_clear_via_compute(struct si_context *sctx, unsigned *buffers, while (color_buffer_mask) { unsigned i = u_bit_scan(&color_buffer_mask); - struct pipe_surface *surf = fb->cbufs[i]; + struct pipe_surface *surf = &fb->cbufs[i]; unsigned depth = surf->u.tex.last_layer - surf->u.tex.first_layer + 1; struct si_texture *tex = (struct si_texture *)surf->texture; @@ -1099,17 +1098,16 @@ static void gfx6_clear(struct pipe_context *ctx, unsigned buffers, { struct si_context *sctx = (struct si_context *)ctx; struct pipe_framebuffer_state *fb = &sctx->framebuffer.state; - struct pipe_surface *zsbuf = fb->zsbuf; - struct si_texture *zstex = zsbuf ? (struct si_texture *)zsbuf->texture : NULL; + struct si_texture *zstex = (struct si_texture *)fb->zsbuf.texture; /* Unset clear flags for non-existent buffers. */ for (unsigned i = 0; i < 8; i++) { - if (i >= fb->nr_cbufs || !fb->cbufs[i]) + if (i >= fb->nr_cbufs || !fb->cbufs[i].texture) buffers &= ~(PIPE_CLEAR_COLOR0 << i); } - if (!zsbuf) + if (!zstex) buffers &= ~PIPE_CLEAR_DEPTHSTENCIL; - else if (!util_format_has_stencil(util_format_description(zsbuf->format))) + else if (!util_format_has_stencil(util_format_description(fb->zsbuf.format))) buffers &= ~PIPE_CLEAR_STENCIL; si_fast_clear(sctx, &buffers, color, depth, stencil); @@ -1125,15 +1123,15 @@ static void gfx6_clear(struct pipe_context *ctx, unsigned buffers, unsigned color_buffer_mask = (buffers & PIPE_CLEAR_COLOR) >> util_logbase2(PIPE_CLEAR_COLOR0); while (color_buffer_mask) { unsigned i = u_bit_scan(&color_buffer_mask); - struct si_texture *tex = (struct si_texture *)fb->cbufs[i]->texture; + struct si_texture *tex = (struct si_texture *)fb->cbufs[i].texture; if (tex->surface.fmask_size == 0) - tex->dirty_level_mask &= ~(1 << fb->cbufs[i]->u.tex.level); + tex->dirty_level_mask &= ~(1 << fb->cbufs[i].u.tex.level); } } - if (zstex && zsbuf->u.tex.first_layer == 0 && - zsbuf->u.tex.last_layer == util_max_layer(&zstex->buffer.b.b, 0)) { - unsigned level = zsbuf->u.tex.level; + if (zstex && fb->zsbuf.u.tex.first_layer == 0 && + fb->zsbuf.u.tex.last_layer == util_max_layer(&zstex->buffer.b.b, 0)) { + unsigned level = fb->zsbuf.u.tex.level; if (si_can_fast_clear_depth(zstex, level, depth, buffers)) { /* Need to disable EXPCLEAR temporarily if clearing @@ -1203,15 +1201,15 @@ static void gfx6_clear(struct pipe_context *ctx, unsigned buffers, if (sctx->db_depth_clear) { sctx->db_depth_clear = false; sctx->db_depth_disable_expclear = false; - zstex->depth_cleared_level_mask_once |= BITFIELD_BIT(zsbuf->u.tex.level); - zstex->depth_cleared_level_mask |= BITFIELD_BIT(zsbuf->u.tex.level); + zstex->depth_cleared_level_mask_once |= BITFIELD_BIT(fb->zsbuf.u.tex.level); + zstex->depth_cleared_level_mask |= BITFIELD_BIT(fb->zsbuf.u.tex.level); si_mark_atom_dirty(sctx, &sctx->atoms.s.db_render_state); } if (sctx->db_stencil_clear) { sctx->db_stencil_clear = false; sctx->db_stencil_disable_expclear = false; - zstex->stencil_cleared_level_mask_once |= BITFIELD_BIT(zsbuf->u.tex.level); + zstex->stencil_cleared_level_mask_once |= BITFIELD_BIT(fb->zsbuf.u.tex.level); si_mark_atom_dirty(sctx, &sctx->atoms.s.db_render_state); } } @@ -1222,17 +1220,16 @@ static void gfx12_clear(struct pipe_context *ctx, unsigned buffers, { struct si_context *sctx = (struct si_context *)ctx; struct pipe_framebuffer_state *fb = &sctx->framebuffer.state; - struct pipe_surface *zsbuf = fb->zsbuf; - struct si_texture *zstex = zsbuf ? (struct si_texture *)zsbuf->texture : NULL; + struct si_texture *zstex = (struct si_texture *)fb->zsbuf.texture; /* Unset clear flags for non-existent buffers. */ for (unsigned i = 0; i < 8; i++) { - if (i >= fb->nr_cbufs || !fb->cbufs[i]) + if (i >= fb->nr_cbufs || !fb->cbufs[i].texture) buffers &= ~(PIPE_CLEAR_COLOR0 << i); } - if (!zsbuf) + if (!zstex) buffers &= ~PIPE_CLEAR_DEPTHSTENCIL; - else if (!util_format_has_stencil(util_format_description(zsbuf->format))) + else if (!util_format_has_stencil(util_format_description(fb->zsbuf.format))) buffers &= ~PIPE_CLEAR_STENCIL; if (unlikely(sctx->sqtt_enabled)) { @@ -1249,8 +1246,8 @@ static void gfx12_clear(struct pipe_context *ctx, unsigned buffers, /* This is only used by the driver, not the hw. */ if (buffers & PIPE_CLEAR_DEPTH) { - zstex->depth_cleared_level_mask |= BITFIELD_BIT(zsbuf->u.tex.level); - zstex->depth_clear_value[zsbuf->u.tex.level] = depth; + zstex->depth_cleared_level_mask |= BITFIELD_BIT(fb->zsbuf.u.tex.level); + zstex->depth_clear_value[fb->zsbuf.u.tex.level] = depth; } } @@ -1277,10 +1274,10 @@ static bool si_try_normal_clear(struct si_context *sctx, struct pipe_surface *ds util_copy_framebuffer_state(&saved_fb, &sctx->framebuffer.state); if (buffers & PIPE_CLEAR_COLOR) { - fb.cbufs[0] = dst; + fb.cbufs[0] = *dst; fb.nr_cbufs = 1; } else { - fb.zsbuf = dst; + fb.zsbuf = *dst; } fb.width = surf_width; diff --git a/src/gallium/drivers/radeonsi/si_debug.c b/src/gallium/drivers/radeonsi/si_debug.c index 74ce37a144a..12aa3161a45 100644 --- a/src/gallium/drivers/radeonsi/si_debug.c +++ b/src/gallium/drivers/radeonsi/si_debug.c @@ -602,17 +602,17 @@ static void si_dump_framebuffer(struct si_context *sctx, struct u_log_context *l int i; for (i = 0; i < state->nr_cbufs; i++) { - if (!state->cbufs[i]) + if (!state->cbufs[i].texture) continue; - tex = (struct si_texture *)state->cbufs[i]->texture; + tex = (struct si_texture *)state->cbufs[i].texture; u_log_printf(log, COLOR_YELLOW "Color buffer %i:" COLOR_RESET "\n", i); si_print_texture_info(sctx->screen, tex, log); u_log_printf(log, "\n"); } - if (state->zsbuf) { - tex = (struct si_texture *)state->zsbuf->texture; + if (state->zsbuf.texture) { + tex = (struct si_texture *)state->zsbuf.texture; u_log_printf(log, COLOR_YELLOW "Depth-stencil buffer:" COLOR_RESET "\n"); si_print_texture_info(sctx->screen, tex, log); u_log_printf(log, "\n"); diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index 35f89bc489d..fe068c8661a 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -889,8 +889,8 @@ void si_update_ps_colorbuf0_slot(struct si_context *sctx) /* Get the color buffer if FBFETCH should be enabled. */ if (sctx->shader.ps.cso && sctx->shader.ps.cso->info.base.fs.uses_fbfetch_output && - sctx->framebuffer.state.nr_cbufs && sctx->framebuffer.state.cbufs[0]) { - surf = sctx->framebuffer.state.cbufs[0]; + sctx->framebuffer.state.nr_cbufs && sctx->framebuffer.state.cbufs[0].texture) { + surf = &sctx->framebuffer.state.cbufs[0]; if (surf) { tex = (struct si_texture *)surf->texture; assert(tex && !tex->is_depth); @@ -3011,9 +3011,8 @@ bool si_gfx_resources_check_encrypted(struct si_context *sctx) struct si_state_blend *blend = sctx->queued.named.blend; for (int i = 0; i < sctx->framebuffer.state.nr_cbufs && !use_encrypted_bo; i++) { - struct pipe_surface *surf = sctx->framebuffer.state.cbufs[i]; - if (surf && surf->texture) { - struct si_texture *tex = (struct si_texture *)surf->texture; + struct si_texture *tex = (struct si_texture *)sctx->framebuffer.state.cbufs[i].texture; + if (tex) { if (!(tex->buffer.flags & RADEON_FLAG_ENCRYPTED)) continue; @@ -3025,30 +3024,26 @@ bool si_gfx_resources_check_encrypted(struct si_context *sctx) } } - if (sctx->framebuffer.state.zsbuf) { - struct si_texture* zs = (struct si_texture *)sctx->framebuffer.state.zsbuf->texture; - if (zs && - (zs->buffer.flags & RADEON_FLAG_ENCRYPTED)) { - /* TODO: This isn't needed if depth.func is PIPE_FUNC_NEVER or PIPE_FUNC_ALWAYS */ - use_encrypted_bo = true; - } + struct si_texture* zs = (struct si_texture *)sctx->framebuffer.state.zsbuf.texture; + if (zs && + (zs->buffer.flags & RADEON_FLAG_ENCRYPTED)) { + /* TODO: This isn't needed if depth.func is PIPE_FUNC_NEVER or PIPE_FUNC_ALWAYS */ + use_encrypted_bo = true; } #ifndef NDEBUG if (use_encrypted_bo) { /* Verify that color buffers are encrypted */ for (int i = 0; i < sctx->framebuffer.state.nr_cbufs; i++) { - struct pipe_surface *surf = sctx->framebuffer.state.cbufs[i]; - if (!surf) + struct si_texture *tex = (struct si_texture *)sctx->framebuffer.state.cbufs[i].texture; + if (!tex) continue; - struct si_texture *tex = (struct si_texture *)surf->texture; - assert(!surf->texture || (tex->buffer.flags & RADEON_FLAG_ENCRYPTED)); + assert(tex->buffer.flags & RADEON_FLAG_ENCRYPTED); } /* Verify that depth/stencil buffer is encrypted */ - if (sctx->framebuffer.state.zsbuf) { - struct pipe_surface *surf = sctx->framebuffer.state.zsbuf; - struct si_texture *tex = (struct si_texture *)surf->texture; - assert(!surf->texture || (tex->buffer.flags & RADEON_FLAG_ENCRYPTED)); + if (sctx->framebuffer.state.zsbuf.texture) { + struct si_texture *tex = (struct si_texture *)sctx->framebuffer.state.zsbuf.texture; + assert(tex->buffer.flags & RADEON_FLAG_ENCRYPTED); } } #endif diff --git a/src/gallium/drivers/radeonsi/si_gfx_cs.c b/src/gallium/drivers/radeonsi/si_gfx_cs.c index 825741d7f82..1ab965e5f49 100644 --- a/src/gallium/drivers/radeonsi/si_gfx_cs.c +++ b/src/gallium/drivers/radeonsi/si_gfx_cs.c @@ -552,7 +552,7 @@ void si_begin_new_gfx_cs(struct si_context *ctx, bool first_cs) ctx->framebuffer.dirty_cbufs = u_bit_consecutive(0, ctx->framebuffer.state.nr_cbufs); /* CLEAR_STATE disables the zbuffer, so only enable it if it's bound. */ - ctx->framebuffer.dirty_zsbuf = ctx->framebuffer.state.zsbuf != NULL; + ctx->framebuffer.dirty_zsbuf = ctx->framebuffer.state.zsbuf.texture != NULL; } else { ctx->framebuffer.dirty_cbufs = u_bit_consecutive(0, 8); ctx->framebuffer.dirty_zsbuf = true; diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 07cddb499e4..78b65e89067 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -196,6 +196,7 @@ static void si_destroy_context(struct pipe_context *context) context->set_debug_callback(context, NULL); util_unreference_framebuffer_state(&sctx->framebuffer.state); + util_framebuffer_init(context, NULL, sctx->framebuffer.fb_cbufs, &sctx->framebuffer.fb_zsbuf); si_release_all_descriptors(sctx); if (sctx->gfx_level >= GFX10 && sctx->has_graphics) diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index a4dd88aed54..a07ebfb4525 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -723,6 +723,7 @@ struct si_images { struct si_framebuffer { struct pipe_framebuffer_state state; + PIPE_FB_SURFACES; //STOP USING THIS unsigned colorbuf_enabled_4bit; unsigned spi_shader_col_format; unsigned spi_shader_col_format_alpha; diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index cbef13fdb8c..9fc9d9948bd 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -104,7 +104,7 @@ static void si_emit_cb_render_state(struct si_context *sctx, unsigned index) blend->cb_target_enabled_4bit) / 4; for (i = 0; i < num_cbufs; i++) { - struct si_surface *surf = (struct si_surface *)sctx->framebuffer.state.cbufs[i]; + struct si_surface *surf = (struct si_surface *)sctx->framebuffer.fb_cbufs[i]; unsigned format, swap, spi_format, colormask; bool has_alpha, has_rgb; @@ -1189,9 +1189,9 @@ static void si_pm4_emit_rasterizer(struct si_context *sctx, unsigned index) gfx12_opt_set_context_reg(R_028230_PA_SC_EDGERULE, SI_TRACKED_PA_SC_EDGERULE, state->pa_sc_edgerule); - if (state->uses_poly_offset && sctx->framebuffer.state.zsbuf) { + if (state->uses_poly_offset && sctx->framebuffer.state.zsbuf.texture) { unsigned db_format_index = - ((struct si_surface *)sctx->framebuffer.state.zsbuf)->db_format_index; + ((struct si_surface *)sctx->framebuffer.fb_zsbuf)->db_format_index; gfx12_opt_set_context_reg(R_028B78_PA_SU_POLY_OFFSET_DB_FMT_CNTL, SI_TRACKED_PA_SU_POLY_OFFSET_DB_FMT_CNTL, @@ -1234,9 +1234,9 @@ static void si_pm4_emit_rasterizer(struct si_context *sctx, unsigned index) gfx11_opt_set_context_reg(R_028230_PA_SC_EDGERULE, SI_TRACKED_PA_SC_EDGERULE, state->pa_sc_edgerule); - if (state->uses_poly_offset && sctx->framebuffer.state.zsbuf) { + if (state->uses_poly_offset && sctx->framebuffer.state.zsbuf.texture) { unsigned db_format_index = - ((struct si_surface *)sctx->framebuffer.state.zsbuf)->db_format_index; + ((struct si_surface *)sctx->framebuffer.fb_zsbuf)->db_format_index; gfx11_opt_set_context_reg(R_028B78_PA_SU_POLY_OFFSET_DB_FMT_CNTL, SI_TRACKED_PA_SU_POLY_OFFSET_DB_FMT_CNTL, @@ -1281,9 +1281,9 @@ static void si_pm4_emit_rasterizer(struct si_context *sctx, unsigned index) radeon_opt_set_context_reg(R_028230_PA_SC_EDGERULE, SI_TRACKED_PA_SC_EDGERULE, state->pa_sc_edgerule); - if (state->uses_poly_offset && sctx->framebuffer.state.zsbuf) { + if (state->uses_poly_offset && sctx->framebuffer.state.zsbuf.texture) { unsigned db_format_index = - ((struct si_surface *)sctx->framebuffer.state.zsbuf)->db_format_index; + ((struct si_surface *)sctx->framebuffer.fb_zsbuf)->db_format_index; radeon_opt_set_context_reg6(R_028B78_PA_SU_POLY_OFFSET_DB_FMT_CNTL, SI_TRACKED_PA_SU_POLY_OFFSET_DB_FMT_CNTL, @@ -1717,8 +1717,7 @@ static void si_bind_dsa_state(struct pipe_context *ctx, void *state) si_mark_atom_dirty(sctx, &sctx->atoms.s.stencil_ref); } - struct pipe_surface *zssurf = sctx->framebuffer.state.zsbuf; - struct si_texture *zstex = (struct si_texture*)(zssurf ? zssurf->texture : NULL); + struct si_texture *zstex = (struct si_texture*)sctx->framebuffer.state.zsbuf.texture; if (sctx->gfx_level == GFX12 && !sctx->screen->options.alt_hiz_logic && sctx->framebuffer.has_stencil && dsa->stencil_enabled && !zstex->force_disable_hiz_his) { @@ -2508,13 +2507,11 @@ static void si_init_depth_surface(struct si_context *sctx, struct si_surface *su static void si_dec_framebuffer_counters(const struct pipe_framebuffer_state *state) { for (int i = 0; i < state->nr_cbufs; ++i) { - struct si_surface *surf = NULL; struct si_texture *tex; - if (!state->cbufs[i]) + if (!state->cbufs[i].texture) continue; - surf = (struct si_surface *)state->cbufs[i]; - tex = (struct si_texture *)surf->base.texture; + tex = (struct si_texture *)state->cbufs[i].texture; p_atomic_dec(&tex->framebuffers_bound); } @@ -2543,8 +2540,8 @@ static void si_update_display_dcc_dirty(struct si_context *sctx) const struct pipe_framebuffer_state *state = &sctx->framebuffer.state; for (unsigned i = 0; i < state->nr_cbufs; i++) { - if (state->cbufs[i]) - si_mark_display_dcc_dirty(sctx, (struct si_texture *)state->cbufs[i]->texture); + if (state->cbufs[i].texture) + si_mark_display_dcc_dirty(sctx, (struct si_texture *)state->cbufs[i].texture); } } @@ -2557,13 +2554,13 @@ static void si_set_framebuffer_state(struct pipe_context *ctx, bool old_any_dst_linear = sctx->framebuffer.any_dst_linear; unsigned old_nr_samples = sctx->framebuffer.nr_samples; unsigned old_colorbuf_enabled_4bit = sctx->framebuffer.colorbuf_enabled_4bit; - bool old_has_zsbuf = !!sctx->framebuffer.state.zsbuf; + bool old_has_zsbuf = !!sctx->framebuffer.state.zsbuf.texture; bool old_has_stencil = old_has_zsbuf && - ((struct si_texture *)sctx->framebuffer.state.zsbuf->texture)->surface.has_stencil; + ((struct si_texture *)sctx->framebuffer.state.zsbuf.texture)->surface.has_stencil; uint8_t old_db_format_index = old_has_zsbuf ? - ((struct si_surface *)sctx->framebuffer.state.zsbuf)->db_format_index : -1; + ((struct si_surface *)sctx->framebuffer.fb_zsbuf)->db_format_index : -1; bool old_has_hiz_his = sctx->framebuffer.has_hiz_his; int i; @@ -2571,20 +2568,31 @@ static void si_set_framebuffer_state(struct pipe_context *ctx, * when PA_SU_HARDWARE_SCREEN_OFFSET != 0 and any_scissor.BR_X/Y <= 0. * We could implement the full workaround here, but it's a useless case. */ - if ((!state->width || !state->height) && (state->nr_cbufs || state->zsbuf)) { + if ((!state->width || !state->height) && (state->nr_cbufs || state->zsbuf.texture)) { unreachable("the framebuffer shouldn't have zero area"); return; } si_fb_barrier_after_rendering(sctx, SI_FB_BARRIER_SYNC_ALL); + /* Take the maximum of the old and new count. If the new count is lower, + * dirtying is needed to disable the unbound colorbuffers. + */ + sctx->framebuffer.dirty_cbufs |= + (1 << MAX2(sctx->framebuffer.state.nr_cbufs, state->nr_cbufs)) - 1; + sctx->framebuffer.dirty_zsbuf |= !pipe_surface_equal(&sctx->framebuffer.state.zsbuf, &state->zsbuf); + + si_dec_framebuffer_counters(&sctx->framebuffer.state); + util_framebuffer_init(ctx, state, sctx->framebuffer.fb_cbufs, &sctx->framebuffer.fb_zsbuf); + util_copy_framebuffer_state(&sctx->framebuffer.state, state); + /* Disable DCC if the formats are incompatible. */ if (sctx->gfx_level >= GFX8 && sctx->gfx_level < GFX11) { - for (i = 0; i < state->nr_cbufs; i++) { - if (!state->cbufs[i]) + for (i = 0; i < sctx->framebuffer.state.nr_cbufs; i++) { + if (!sctx->framebuffer.state.cbufs[i].texture) continue; - surf = (struct si_surface *)state->cbufs[i]; + surf = (struct si_surface *)sctx->framebuffer.fb_cbufs[i]; tex = (struct si_texture *)surf->base.texture; if (!surf->dcc_incompatible) @@ -2598,16 +2606,6 @@ static void si_set_framebuffer_state(struct pipe_context *ctx, } } - /* Take the maximum of the old and new count. If the new count is lower, - * dirtying is needed to disable the unbound colorbuffers. - */ - sctx->framebuffer.dirty_cbufs |= - (1 << MAX2(sctx->framebuffer.state.nr_cbufs, state->nr_cbufs)) - 1; - sctx->framebuffer.dirty_zsbuf |= sctx->framebuffer.state.zsbuf != state->zsbuf; - - si_dec_framebuffer_counters(&sctx->framebuffer.state); - util_copy_framebuffer_state(&sctx->framebuffer.state, state); - /* The framebuffer state must be set before the barrier. */ si_fb_barrier_before_rendering(sctx); @@ -2638,10 +2636,10 @@ static void si_set_framebuffer_state(struct pipe_context *ctx, sctx->framebuffer.has_hiz_his = false; for (i = 0; i < state->nr_cbufs; i++) { - if (!state->cbufs[i]) + if (!state->cbufs[i].texture) continue; - surf = (struct si_surface *)state->cbufs[i]; + surf = (struct si_surface *)sctx->framebuffer.fb_cbufs[i]; tex = (struct si_texture *)surf->base.texture; if (!surf->color_initialized) { @@ -2707,8 +2705,8 @@ static void si_set_framebuffer_state(struct pipe_context *ctx, struct si_texture *zstex = NULL; - if (state->zsbuf) { - surf = (struct si_surface *)state->zsbuf; + if (state->zsbuf.texture) { + surf = (struct si_surface *)sctx->framebuffer.fb_zsbuf; zstex = (struct si_texture *)surf->base.texture; if (!surf->depth_initialized) { @@ -2760,7 +2758,7 @@ static void si_set_framebuffer_state(struct pipe_context *ctx, if (sctx->screen->info.has_out_of_order_rast && (sctx->framebuffer.colorbuf_enabled_4bit != old_colorbuf_enabled_4bit || - !!sctx->framebuffer.state.zsbuf != old_has_zsbuf || + !!sctx->framebuffer.state.zsbuf.texture != old_has_zsbuf || (zstex && zstex->surface.has_stencil != old_has_stencil))) si_mark_atom_dirty(sctx, &sctx->atoms.s.msaa_config); @@ -2799,8 +2797,8 @@ static void gfx6_emit_framebuffer_state(struct si_context *sctx, unsigned index) struct si_texture *tex = NULL; struct si_surface *cb = NULL; bool is_msaa_resolve = state->nr_cbufs == 2 && - state->cbufs[0] && state->cbufs[0]->texture->nr_samples > 1 && - state->cbufs[1] && state->cbufs[1]->texture->nr_samples <= 1; + state->cbufs[0].texture && state->cbufs[0].texture->nr_samples > 1 && + state->cbufs[1].texture && state->cbufs[1].texture->nr_samples <= 1; /* CB can't do MSAA resolve on gfx11. */ assert(!is_msaa_resolve || sctx->gfx_level < GFX11); @@ -2826,7 +2824,7 @@ static void gfx6_emit_framebuffer_state(struct si_context *sctx, unsigned index) continue; } - cb = (struct si_surface *)state->cbufs[i]; + cb = (struct si_surface *)sctx->framebuffer.fb_cbufs[i]; if (!cb) { radeon_set_context_reg(R_028C70_CB_COLOR0_INFO + i * 0x3C, sctx->gfx_level >= GFX11 ? @@ -2972,8 +2970,8 @@ static void gfx6_emit_framebuffer_state(struct si_context *sctx, unsigned index) radeon_set_context_reg(R_028C70_CB_COLOR0_INFO + i * 0x3C, 0); /* ZS buffer. */ - if (state->zsbuf && sctx->framebuffer.dirty_zsbuf) { - struct si_surface *zb = (struct si_surface *)state->zsbuf; + if (state->zsbuf.texture && sctx->framebuffer.dirty_zsbuf) { + struct si_surface *zb = (struct si_surface *)sctx->framebuffer.fb_zsbuf; struct si_texture *tex = (struct si_texture *)zb->base.texture; radeon_add_to_buffer_list(sctx, &sctx->gfx_cs, &tex->buffer, RADEON_USAGE_READWRITE | @@ -3099,8 +3097,8 @@ static void gfx11_dgpu_emit_framebuffer_state(struct si_context *sctx, unsigned struct si_texture *tex = NULL; struct si_surface *cb = NULL; bool is_msaa_resolve = state->nr_cbufs == 2 && - state->cbufs[0] && state->cbufs[0]->texture->nr_samples > 1 && - state->cbufs[1] && state->cbufs[1]->texture->nr_samples <= 1; + state->cbufs[0].texture && state->cbufs[0].texture->nr_samples > 1 && + state->cbufs[1].texture && state->cbufs[1].texture->nr_samples <= 1; /* CB can't do MSAA resolve on gfx11. */ assert(!is_msaa_resolve); @@ -3125,7 +3123,7 @@ static void gfx11_dgpu_emit_framebuffer_state(struct si_context *sctx, unsigned continue; } - cb = (struct si_surface *)state->cbufs[i]; + cb = (struct si_surface *)sctx->framebuffer.fb_cbufs[i]; if (!cb) { gfx11_set_context_reg(R_028C70_CB_COLOR0_INFO + i * 0x3C, S_028C70_FORMAT_GFX11(V_028C70_COLOR_INVALID)); @@ -3173,8 +3171,8 @@ static void gfx11_dgpu_emit_framebuffer_state(struct si_context *sctx, unsigned gfx11_set_context_reg(R_028C70_CB_COLOR0_INFO + i * 0x3C, 0); /* ZS buffer. */ - if (state->zsbuf && sctx->framebuffer.dirty_zsbuf) { - struct si_surface *zb = (struct si_surface *)state->zsbuf; + if (state->zsbuf.texture && sctx->framebuffer.dirty_zsbuf) { + struct si_surface *zb = (struct si_surface *)sctx->framebuffer.fb_zsbuf; struct si_texture *tex = (struct si_texture *)zb->base.texture; radeon_add_to_buffer_list(sctx, &sctx->gfx_cs, &tex->buffer, RADEON_USAGE_READWRITE | @@ -3248,8 +3246,8 @@ static void gfx12_emit_framebuffer_state(struct si_context *sctx, unsigned index struct si_texture *tex = NULL; struct si_surface *cb = NULL; bool is_msaa_resolve = state->nr_cbufs == 2 && - state->cbufs[0] && state->cbufs[0]->texture->nr_samples > 1 && - state->cbufs[1] && state->cbufs[1]->texture->nr_samples <= 1; + state->cbufs[0].texture && state->cbufs[0].texture->nr_samples > 1 && + state->cbufs[1].texture && state->cbufs[1].texture->nr_samples <= 1; /* CB can't do MSAA resolve. */ assert(!is_msaa_resolve); @@ -3274,7 +3272,7 @@ static void gfx12_emit_framebuffer_state(struct si_context *sctx, unsigned index continue; } - cb = (struct si_surface *)state->cbufs[i]; + cb = (struct si_surface *)sctx->framebuffer.fb_cbufs[i]; if (!cb) { gfx12_set_context_reg(R_028EC0_CB_COLOR0_INFO + i * 4, S_028EC0_FORMAT(V_028C70_COLOR_INVALID)); @@ -3312,8 +3310,8 @@ static void gfx12_emit_framebuffer_state(struct si_context *sctx, unsigned index gfx12_set_context_reg(R_028EC0_CB_COLOR0_INFO + i * 4, 0); /* ZS buffer. */ - if (state->zsbuf && sctx->framebuffer.dirty_zsbuf) { - struct si_surface *zb = (struct si_surface *)state->zsbuf; + if (state->zsbuf.texture && sctx->framebuffer.dirty_zsbuf) { + struct si_surface *zb = (struct si_surface *)sctx->framebuffer.fb_zsbuf; struct si_texture *tex = (struct si_texture *)zb->base.texture; radeon_add_to_buffer_list(sctx, &sctx->gfx_cs, &tex->buffer, @@ -3399,8 +3397,8 @@ static bool si_out_of_order_rasterization(struct si_context *sctx) struct si_dsa_order_invariance dsa_order_invariant = {.zs = true, .pass_set = true}; - if (sctx->framebuffer.state.zsbuf) { - struct si_texture *zstex = (struct si_texture *)sctx->framebuffer.state.zsbuf->texture; + if (sctx->framebuffer.state.zsbuf.texture) { + struct si_texture *zstex = (struct si_texture *)sctx->framebuffer.state.zsbuf.texture; bool has_stencil = zstex->surface.has_stencil; dsa_order_invariant = dsa->order_invariance[has_stencil]; if (!dsa_order_invariant.zs) @@ -3535,8 +3533,8 @@ static void si_emit_msaa_config(struct si_context *sctx, unsigned index) if (sctx->framebuffer.nr_samples > 1 || sctx->smoothing_enabled) { - if (sctx->framebuffer.state.zsbuf) { - z_samples = sctx->framebuffer.state.zsbuf->texture->nr_samples; + if (sctx->framebuffer.state.zsbuf.texture) { + z_samples = sctx->framebuffer.state.zsbuf.texture->nr_samples; z_samples = MAX2(1, z_samples); } else { z_samples = coverage_samples; diff --git a/src/gallium/drivers/radeonsi/si_state_binning.c b/src/gallium/drivers/radeonsi/si_state_binning.c index b80fcf40e55..117917e2d9f 100644 --- a/src/gallium/drivers/radeonsi/si_state_binning.c +++ b/src/gallium/drivers/radeonsi/si_state_binning.c @@ -52,7 +52,7 @@ static struct uvec2 gfx9_get_color_bin_size(struct si_context *sctx, unsigned cb if (!(cb_target_enabled_4bit & (0xf << (i * 4)))) continue; - struct si_texture *tex = (struct si_texture *)sctx->framebuffer.state.cbufs[i]->texture; + struct si_texture *tex = (struct si_texture *)sctx->framebuffer.state.cbufs[i].texture; sum += tex->surface.bpe; } @@ -160,13 +160,13 @@ static struct uvec2 gfx9_get_depth_bin_size(struct si_context *sctx) { struct si_state_dsa *dsa = sctx->queued.named.dsa; - if (!sctx->framebuffer.state.zsbuf || (!dsa->depth_enabled && !dsa->stencil_enabled)) { + if (!sctx->framebuffer.state.zsbuf.texture || (!dsa->depth_enabled && !dsa->stencil_enabled)) { /* Return the max size. */ struct uvec2 size = {512, 512}; return size; } - struct si_texture *tex = (struct si_texture *)sctx->framebuffer.state.zsbuf->texture; + struct si_texture *tex = (struct si_texture *)sctx->framebuffer.state.zsbuf.texture; unsigned depth_coeff = dsa->depth_enabled ? 5 : 0; unsigned stencil_coeff = tex->surface.has_stencil && dsa->stencil_enabled ? 1 : 0; unsigned sum = 4 * (depth_coeff + stencil_coeff) * MAX2(tex->buffer.b.b.nr_samples, 1); @@ -314,10 +314,10 @@ static void gfx10_get_bin_sizes(struct si_context *sctx, unsigned cb_target_enab bool has_fmask = false; for (unsigned i = 0; i < sctx->framebuffer.state.nr_cbufs; i++) { - if (!sctx->framebuffer.state.cbufs[i]) + if (!sctx->framebuffer.state.cbufs[i].texture) continue; - struct si_texture *tex = (struct si_texture *)sctx->framebuffer.state.cbufs[i]->texture; + struct si_texture *tex = (struct si_texture *)sctx->framebuffer.state.cbufs[i].texture; const unsigned mmrt = num_fragments == 1 ? 1 : (ps_iter_sample ? num_fragments : 2); cColor += tex->surface.bpe * mmrt; @@ -362,12 +362,12 @@ static void gfx10_get_bin_sizes(struct si_context *sctx, unsigned cb_target_enab color_bin_size->x = MAX2(binSizeX, minBinSizeX); color_bin_size->y = MAX2(binSizeY, minBinSizeY); - if (!sctx->framebuffer.state.zsbuf) { + if (!sctx->framebuffer.state.zsbuf.texture) { /* Set to max sizes when no depth buffer is bound. */ depth_bin_size->x = 512; depth_bin_size->y = 512; } else { - struct si_texture *zstex = (struct si_texture *)sctx->framebuffer.state.zsbuf->texture; + struct si_texture *zstex = (struct si_texture *)sctx->framebuffer.state.zsbuf.texture; struct si_state_dsa *dsa = sctx->queued.named.dsa; const unsigned cPerDepthSample = dsa->depth_enabled ? 5 : 0; @@ -469,7 +469,7 @@ void si_emit_dpbb_state(struct si_context *sctx, unsigned index) /* Disable DPBB when it's believed to be inefficient. */ if (sscreen->info.max_render_backends > 4 && ps_can_kill && db_can_reject_z_trivially && - sctx->framebuffer.state.zsbuf && dsa->db_can_write) { + sctx->framebuffer.state.zsbuf.texture && dsa->db_can_write) { si_emit_dpbb_disable(sctx); return; } diff --git a/src/gallium/drivers/radeonsi/si_state_draw.cpp b/src/gallium/drivers/radeonsi/si_state_draw.cpp index 2406e8966b0..3edc6ad5afd 100644 --- a/src/gallium/drivers/radeonsi/si_state_draw.cpp +++ b/src/gallium/drivers/radeonsi/si_state_draw.cpp @@ -2459,9 +2459,9 @@ static void si_draw(struct pipe_context *ctx, } /* On Gfx12, this is only used to detect whether a depth texture is in the cleared state. */ - if (sctx->framebuffer.state.zsbuf) { - struct si_texture *zstex = (struct si_texture *)sctx->framebuffer.state.zsbuf->texture; - zstex->depth_cleared_level_mask &= ~BITFIELD_BIT(sctx->framebuffer.state.zsbuf->u.tex.level); + if (sctx->framebuffer.state.zsbuf.texture) { + struct si_texture *zstex = (struct si_texture *)sctx->framebuffer.state.zsbuf.texture; + zstex->depth_cleared_level_mask &= ~BITFIELD_BIT(sctx->framebuffer.state.zsbuf.u.tex.level); } #ifdef HAVE_PERFETTO diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.cpp b/src/gallium/drivers/radeonsi/si_state_shaders.cpp index bd8465f853a..c19c1d750c4 100644 --- a/src/gallium/drivers/radeonsi/si_state_shaders.cpp +++ b/src/gallium/drivers/radeonsi/si_state_shaders.cpp @@ -2589,7 +2589,7 @@ void si_ps_key_update_framebuffer(struct si_context *sctx) /* ps_uses_fbfetch is true only if the color buffer is bound. */ if (sctx->ps_uses_fbfetch) { - struct pipe_surface *cb0 = sctx->framebuffer.state.cbufs[0]; + struct pipe_surface *cb0 = &sctx->framebuffer.state.cbufs[0]; struct pipe_resource *tex = cb0->texture; /* 1D textures are allocated and used as 2D on GFX9. */ @@ -2632,7 +2632,7 @@ void si_ps_key_update_framebuffer_blend_dsa_rasterizer(struct si_context *sctx) #endif key->ps.part.epilog.kill_z = sel->info.writes_z && - (!sctx->framebuffer.state.zsbuf || !dsa->depth_enabled || + (!sctx->framebuffer.state.zsbuf.texture || !dsa->depth_enabled || (sel->info.output_z_equals_input_z && !rs->multisample_enable)); key->ps.part.epilog.kill_stencil = sel->info.writes_stencil && (!sctx->framebuffer.has_stencil || !dsa->stencil_enabled); diff --git a/src/gallium/drivers/radeonsi/si_test_blit_perf.c b/src/gallium/drivers/radeonsi/si_test_blit_perf.c index a8175682572..307ae070114 100644 --- a/src/gallium/drivers/radeonsi/si_test_blit_perf.c +++ b/src/gallium/drivers/radeonsi/si_test_blit_perf.c @@ -502,15 +502,13 @@ void si_test_blit_perf(struct si_screen *sscreen) } for (unsigned method = 0; method < NUM_METHODS; method++) { - struct pipe_surface *dst_surf = NULL; + struct pipe_surface surf_templ; /* Create pipe_surface for clears. */ if (test_flavor == TEST_FB_CLEAR || test_flavor == TEST_CLEAR) { - struct pipe_surface surf_templ; u_surface_default_template(&surf_templ, dst[size_factor]); surf_templ.u.tex.last_layer = dst[size_factor]->depth0 - 1; - dst_surf = ctx->create_surface(ctx, dst[size_factor], &surf_templ); /* Bind the colorbuffer for FB clears. */ if (box_flavor == BOX_FULL) { @@ -520,7 +518,7 @@ void si_test_blit_perf(struct si_screen *sscreen) fb.layers = dst[size_factor]->depth0; fb.samples = dst[size_factor]->nr_samples; fb.nr_cbufs = 1; - fb.cbufs[0] = dst_surf; + fb.cbufs[0] = surf_templ; ctx->set_framebuffer_state(ctx, &fb); si_emit_barrier_direct(sctx); } @@ -545,33 +543,33 @@ void si_test_blit_perf(struct si_screen *sscreen) ctx->clear(ctx, PIPE_CLEAR_COLOR, NULL, clear_color, 0, 0); sctx->barrier_flags |= SI_BARRIER_SYNC_AND_INV_CB | SI_BARRIER_INV_L2; } else { - ctx->clear_render_target(ctx, dst_surf, clear_color, + ctx->clear_render_target(ctx, &surf_templ, clear_color, dst_box.x, dst_box.y, dst_box.width, dst_box.height, false); } break; case METHOD_GFX: - si_gfx_clear_render_target(ctx, dst_surf, clear_color, + si_gfx_clear_render_target(ctx, &surf_templ, clear_color, dst_box.x, dst_box.y, dst_box.width, dst_box.height, false); break; case METHOD_COMPUTE: success &= - si_compute_clear_image(sctx, dst_surf->texture, - dst_surf->format, 0, &dst_box, + si_compute_clear_image(sctx, surf_templ.texture, + surf_templ.format, 0, &dst_box, clear_color, false, false); break; case METHOD_SPECIAL: if (test_flavor == TEST_CLEAR) { success &= - si_compute_fast_clear_image(sctx, dst_surf->texture, - dst_surf->format, 0, + si_compute_fast_clear_image(sctx, surf_templ.texture, + surf_templ.format, 0, &dst_box, clear_color, false, false); } else { - ctx->clear_render_target(ctx, dst_surf, clear_color, + ctx->clear_render_target(ctx, &surf_templ, clear_color, dst_box.x, dst_box.y, dst_box.width, dst_box.height, false); @@ -646,7 +644,6 @@ void si_test_blit_perf(struct si_screen *sscreen) } ctx->end_query(ctx, q); - pipe_surface_reference(&dst_surf, NULL); /* Wait for idle after all tests. */ sctx->barrier_flags |= SI_BARRIER_SYNC_AND_INV_CB | diff --git a/src/gallium/drivers/radeonsi/si_vpe.c b/src/gallium/drivers/radeonsi/si_vpe.c index a8530e697af..a308e18da87 100644 --- a/src/gallium/drivers/radeonsi/si_vpe.c +++ b/src/gallium/drivers/radeonsi/si_vpe.c @@ -513,7 +513,7 @@ si_vpe_set_color_space(const struct pipe_vpp_desc *process_properties, static enum vpe_status si_vpe_set_plane_info(struct vpe_video_processor *vpeproc, const struct pipe_vpp_desc *process_properties, - struct pipe_surface **surfaces, + struct pipe_surface *surfaces, int which_surface, struct vpe_surface_info *surface_info) { @@ -533,13 +533,13 @@ si_vpe_set_plane_info(struct vpe_video_processor *vpeproc, /* Only support 1 plane for RGB formats, and 2 plane format for YUV formats */ if (util_format_is_yuv(format) && util_format_get_num_planes(format) == 2) { - si_tex_0 = (struct si_texture *)surfaces[0]->texture; - si_tex_1 = (struct si_texture *)surfaces[1]->texture; + si_tex_0 = (struct si_texture *)surfaces[0].texture; + si_tex_1 = (struct si_texture *)surfaces[1].texture; plane_address->type = VPE_PLN_ADDR_TYPE_VIDEO_PROGRESSIVE; plane_address->video_progressive.luma_addr.quad_part = si_tex_0->buffer.gpu_address + si_tex_0->surface.u.gfx9.surf_offset; plane_address->video_progressive.chroma_addr.quad_part = si_tex_1->buffer.gpu_address + si_tex_1->surface.u.gfx9.surf_offset; } else if (!util_format_is_yuv(format) && util_format_get_num_planes(format) == 1){ - si_tex_0 = (struct si_texture *)surfaces[0]->texture; + si_tex_0 = (struct si_texture *)surfaces[0].texture; si_tex_1 = NULL; plane_address->type = VPE_PLN_ADDR_TYPE_GRAPHICS; plane_address->grph.addr.quad_part = si_tex_0->buffer.gpu_address + si_tex_0->surface.u.gfx9.surf_offset; @@ -548,7 +548,7 @@ si_vpe_set_plane_info(struct vpe_video_processor *vpeproc, /* 1st plane ret setting */ uint16_t width, height; - pipe_surface_size(surfaces[0], &width, &height); + pipe_surface_size(&surfaces[0], &width, &height); plane_size->surface_size.x = 0; plane_size->surface_size.y = 0; plane_size->surface_size.width = width; @@ -558,7 +558,7 @@ si_vpe_set_plane_info(struct vpe_video_processor *vpeproc, /* YUV 2nd plane ret setting */ if (util_format_get_num_planes(format) == 2) { - pipe_surface_size(surfaces[1], &width, &height); + pipe_surface_size(&surfaces[1], &width, &height); plane_size->chroma_size.x = 0; plane_size->chroma_size.y = 0; plane_size->chroma_size.width = width; @@ -576,7 +576,7 @@ si_vpe_set_plane_info(struct vpe_video_processor *vpeproc, static enum vpe_status si_vpe_set_surface_info(struct vpe_video_processor *vpeproc, const struct pipe_vpp_desc *process_properties, - struct pipe_surface **surfaces, + struct pipe_surface *surfaces, int which_surface, struct vpe_surface_info *surface_info) { @@ -586,7 +586,7 @@ si_vpe_set_surface_info(struct vpe_video_processor *vpeproc, if (VPE_STATUS_OK != si_vpe_set_plane_info(vpeproc, process_properties, surfaces, which_surface, surface_info)) return VPE_STATUS_NOT_SUPPORTED; - struct si_texture *tex = (struct si_texture *)surfaces[0]->texture; + struct si_texture *tex = (struct si_texture *)surfaces[0].texture; surface_info->swizzle = tex->surface.u.gfx9.swizzle_mode; /* DCC not supported */ @@ -691,8 +691,8 @@ si_vpe_set_stream_out_param(struct vpe_video_processor *vpeproc, if (process_properties->background_color) { build_param->target_rect.x = 0; build_param->target_rect.y = 0; - build_param->target_rect.width = pipe_surface_width(vpeproc->dst_surfaces[0]); - build_param->target_rect.height = pipe_surface_height(vpeproc->dst_surfaces[0]); + build_param->target_rect.width = pipe_surface_width(&vpeproc->dst_surfaces[0]); + build_param->target_rect.height = pipe_surface_height(&vpeproc->dst_surfaces[0]); } else { build_param->target_rect.x = process_properties->dst_region.x0; build_param->target_rect.y = process_properties->dst_region.y0; @@ -874,30 +874,26 @@ si_vpe_processor_begin_frame(struct pipe_video_codec *codec, struct pipe_picture_desc *picture) { struct vpe_video_processor *vpeproc = (struct vpe_video_processor *)codec; - struct pipe_surface **dst_surfaces; + struct pipe_surface *dst_surfaces; assert(codec); dst_surfaces = target->get_surfaces(target); - if (!dst_surfaces || !dst_surfaces[0]) { - SIVPE_ERR("Get target surface failed\n"); - return; - } - vpeproc->dst_surfaces = dst_surfaces; + memcpy(vpeproc->dst_surfaces, dst_surfaces, sizeof(vpeproc->dst_surfaces)); } static void si_vpe_cs_add_surface_buffer(struct vpe_video_processor *vpeproc, - struct pipe_surface **surfaces, + struct pipe_surface *surfaces, unsigned usage) { struct si_resource *si_res; int i; for (i = 0; i < VL_MAX_SURFACES; ++i) { - if (!surfaces[i]) + if (!surfaces[i].texture) continue; - si_res = si_resource(surfaces[i]->texture); + si_res = si_resource(surfaces[i].texture); vpeproc->ws->cs_add_buffer(&vpeproc->cs, si_res->buf, usage | RADEON_USAGE_SYNCHRONIZED, 0); } } @@ -989,8 +985,8 @@ si_vpe_show_process_settings(struct vpe_video_processor *vpeproc, static enum vpe_status si_vpe_processor_check_and_build_settins(struct vpe_video_processor *vpeproc, const struct pipe_vpp_desc *process_properties, - struct pipe_surface **src_surfaces, - struct pipe_surface **dst_surfaces) + struct pipe_surface *src_surfaces, + struct pipe_surface *dst_surfaces) { enum vpe_status result = VPE_STATUS_OK; struct vpe *vpe_handle = vpeproc->vpe_handle; @@ -1073,8 +1069,8 @@ si_vpe_processor_check_and_build_settins(struct vpe_video_processor *vpeproc, static enum vpe_status si_vpe_construct_blt(struct vpe_video_processor *vpeproc, const struct pipe_vpp_desc *process_properties, - struct pipe_surface **src_surfaces, - struct pipe_surface **dst_surfaces) + struct pipe_surface *src_surfaces, + struct pipe_surface *dst_surfaces) { enum vpe_status result = VPE_STATUS_OK; struct vpe *vpe_handle = vpeproc->vpe_handle; @@ -1251,15 +1247,11 @@ si_vpe_processor_process_frame(struct pipe_video_codec *codec, enum vpe_status result; /* Variables for allocating temp working buffer */ - struct pipe_surface **tmp_geo_scaling_surf_1; - struct pipe_surface **tmp_geo_scaling_surf_2; + struct pipe_surface *tmp_geo_scaling_surf_1; + struct pipe_surface *tmp_geo_scaling_surf_2; /* Get input surface */ - vpeproc->src_surfaces = input_texture->get_surfaces(input_texture); - if (!vpeproc->src_surfaces || !vpeproc->src_surfaces[0]) { - SIVPE_ERR("Get source surface failed\n"); - return 1; - } + memcpy(vpeproc->src_surfaces, input_texture->get_surfaces(input_texture), sizeof(vpeproc->src_surfaces)); /* Get scaling ratio info */ src_rect_width = process_properties->src_region.x1 - process_properties->src_region.x0; @@ -1305,7 +1297,7 @@ si_vpe_processor_process_frame(struct pipe_video_codec *codec, /* Geometric Scaling #2: Allocate working frame buffer of geometric scaling */ if (!vpeproc->geometric_buf[0] || !vpeproc->geometric_buf[1]) { - struct si_texture *dst_tex = (struct si_texture *)vpeproc->dst_surfaces[0]->texture; + struct si_texture *dst_tex = (struct si_texture *)vpeproc->dst_surfaces[0].texture; struct pipe_video_buffer templat; if (vpeproc->geometric_buf[0]) @@ -1339,9 +1331,9 @@ si_vpe_processor_process_frame(struct pipe_video_codec *codec, if (vpeproc->geometric_passes > 1) { struct pipe_vpp_desc process_geoscl; struct u_rect *src_region, *dst_region; - struct pipe_surface **src_surfaces; - struct pipe_surface **dst_surfaces; - struct pipe_surface **tmp_surfaces; + struct pipe_surface *src_surfaces; + struct pipe_surface *dst_surfaces; + struct pipe_surface *tmp_surfaces; src_region = &process_geoscl.src_region; dst_region = &process_geoscl.dst_region; @@ -1388,8 +1380,6 @@ si_vpe_processor_process_frame(struct pipe_video_codec *codec, result = si_vpe_construct_blt(vpeproc, &process_geoscl, src_surfaces, dst_surfaces); if (VPE_STATUS_OK != result) { - pipe_surface_reference(tmp_geo_scaling_surf_1, NULL); - pipe_surface_reference(tmp_geo_scaling_surf_2, NULL); SIVPE_ERR("Failed in Geometric Scaling first blt command\n"); return result; } @@ -1424,8 +1414,6 @@ si_vpe_processor_process_frame(struct pipe_video_codec *codec, result = si_vpe_construct_blt(vpeproc, &process_geoscl, src_surfaces, dst_surfaces); if (VPE_STATUS_OK != result) { - pipe_surface_reference(tmp_geo_scaling_surf_1, NULL); - pipe_surface_reference(tmp_geo_scaling_surf_2, NULL); SIVPE_ERR("Failed in Geometric Scaling first blt command\n"); return result; } @@ -1450,8 +1438,6 @@ si_vpe_processor_process_frame(struct pipe_video_codec *codec, dst_surfaces = vpeproc->dst_surfaces; result = si_vpe_construct_blt(vpeproc, &process_geoscl, src_surfaces, dst_surfaces); if (VPE_STATUS_OK != result) { - pipe_surface_reference(tmp_geo_scaling_surf_1, NULL); - pipe_surface_reference(tmp_geo_scaling_surf_2, NULL); SIVPE_ERR("Failed in Geometric Scaling first blt command\n"); return result; } diff --git a/src/gallium/drivers/radeonsi/si_vpe.h b/src/gallium/drivers/radeonsi/si_vpe.h index f0466d6faa8..01f402d9ec5 100644 --- a/src/gallium/drivers/radeonsi/si_vpe.h +++ b/src/gallium/drivers/radeonsi/si_vpe.h @@ -71,8 +71,8 @@ struct vpe_video_processor { uint8_t log_level; - struct pipe_surface **src_surfaces; - struct pipe_surface **dst_surfaces; + struct pipe_surface src_surfaces[VL_MAX_SURFACES]; + struct pipe_surface dst_surfaces[VL_MAX_SURFACES]; /* For HDR content display */ void *gm_handle; diff --git a/src/gallium/drivers/softpipe/sp_clear.c b/src/gallium/drivers/softpipe/sp_clear.c index d7ff2499c25..f5cef98a6a9 100644 --- a/src/gallium/drivers/softpipe/sp_clear.c +++ b/src/gallium/drivers/softpipe/sp_clear.c @@ -53,7 +53,7 @@ softpipe_clear(struct pipe_context *pipe, unsigned buffers, double depth, unsigned stencil) { struct softpipe_context *softpipe = softpipe_context(pipe); - struct pipe_surface *zsbuf = softpipe->framebuffer.zsbuf; + struct pipe_surface *zsbuf = &softpipe->framebuffer.zsbuf; unsigned zs_buffers = buffers & PIPE_CLEAR_DEPTHSTENCIL; uint64_t cv; uint i; diff --git a/src/gallium/drivers/softpipe/sp_context.c b/src/gallium/drivers/softpipe/sp_context.c index 36662dc6fc5..e231656520c 100644 --- a/src/gallium/drivers/softpipe/sp_context.c +++ b/src/gallium/drivers/softpipe/sp_context.c @@ -141,13 +141,11 @@ softpipe_is_resource_referenced( struct pipe_context *pipe, /* check if any of the bound drawing surfaces are this texture */ if (softpipe->dirty_render_cache) { for (i = 0; i < softpipe->framebuffer.nr_cbufs; i++) { - if (softpipe->framebuffer.cbufs[i] && - softpipe->framebuffer.cbufs[i]->texture == texture) { + if (softpipe->framebuffer.cbufs[i].texture == texture) { return SP_REFERENCED_FOR_WRITE; } } - if (softpipe->framebuffer.zsbuf && - softpipe->framebuffer.zsbuf->texture == texture) { + if (softpipe->framebuffer.zsbuf.texture == texture) { return SP_REFERENCED_FOR_WRITE; } } diff --git a/src/gallium/drivers/softpipe/sp_quad_blend.c b/src/gallium/drivers/softpipe/sp_quad_blend.c index 2127be2b39e..881c097c11d 100644 --- a/src/gallium/drivers/softpipe/sp_quad_blend.c +++ b/src/gallium/drivers/softpipe/sp_quad_blend.c @@ -929,7 +929,7 @@ blend_fallback(struct quad_stage *qs, softpipe->fs_variant->info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS]; for (cbuf = 0; cbuf < softpipe->framebuffer.nr_cbufs; cbuf++) { - if (softpipe->framebuffer.cbufs[cbuf]) { + if (softpipe->framebuffer.cbufs[cbuf].texture) { /* which blend/mask state index to use: */ const uint blend_buf = blend->independent_blend_enable ? cbuf : 0; float dest[4][TGSI_QUAD_SIZE]; @@ -1233,7 +1233,7 @@ choose_blend_quad(struct quad_stage *qs, softpipe->blend->rt[0].colormask == 0xf && softpipe->framebuffer.nr_cbufs == 1) { - if (softpipe->framebuffer.cbufs[0] == NULL) { + if (softpipe->framebuffer.cbufs[0].texture == NULL) { qs->run = blend_noop; } else if (!blend->rt[0].blend_enable) { @@ -1260,8 +1260,8 @@ choose_blend_quad(struct quad_stage *qs, * whether color clamping is needed. */ for (i = 0; i < softpipe->framebuffer.nr_cbufs; i++) { - if (softpipe->framebuffer.cbufs[i]) { - const enum pipe_format format = softpipe->framebuffer.cbufs[i]->format; + if (softpipe->framebuffer.cbufs[i].texture) { + const enum pipe_format format = softpipe->framebuffer.cbufs[i].format; const struct util_format_description *desc = util_format_description(format); /* assuming all or no color channels are normalized: */ diff --git a/src/gallium/drivers/softpipe/sp_quad_depth_test.c b/src/gallium/drivers/softpipe/sp_quad_depth_test.c index 0bde3c999ee..ea3cdba1617 100644 --- a/src/gallium/drivers/softpipe/sp_quad_depth_test.c +++ b/src/gallium/drivers/softpipe/sp_quad_depth_test.c @@ -43,7 +43,6 @@ struct depth_data { - struct pipe_surface *ps; enum pipe_format format; unsigned bzzzz[TGSI_QUAD_SIZE]; /**< Z values fetched from depth buffer */ unsigned qzzzz[TGSI_QUAD_SIZE]; /**< Z values from the quad */ @@ -851,7 +850,7 @@ depth_test_quads_fallback(struct quad_stage *qs, const struct tgsi_shader_info *fsInfo = &qs->softpipe->fs_variant->info; bool interp_depth = !fsInfo->writes_z || qs->softpipe->early_depth; bool shader_stencil_ref = fsInfo->writes_stencil; - bool have_zs = !!qs->softpipe->framebuffer.zsbuf; + bool have_zs = !!qs->softpipe->framebuffer.zsbuf.texture; struct depth_data data; unsigned vp_idx = quads[0]->input.viewport_index; @@ -862,8 +861,7 @@ depth_test_quads_fallback(struct quad_stage *qs, qs->softpipe->depth_stencil->depth_bounds_test)) { float near_val, far_val; - data.ps = qs->softpipe->framebuffer.zsbuf; - data.format = data.ps->format; + data.format = qs->softpipe->framebuffer.zsbuf.format; data.tile = sp_get_cached_tile(qs->softpipe->zsbuf_cache, quads[0]->input.x0, quads[0]->input.y0, quads[0]->input.layer); @@ -1006,7 +1004,7 @@ choose_depth_test(struct quad_stage *qs, bool depth_bounds = qs->softpipe->depth_stencil->depth_bounds_test; - if(!qs->softpipe->framebuffer.zsbuf) + if(!qs->softpipe->framebuffer.zsbuf.texture) depth = depthwrite = stencil = false; /* default */ @@ -1030,7 +1028,7 @@ choose_depth_test(struct quad_stage *qs, !stencil && !depth_bounds) { - if (qs->softpipe->framebuffer.zsbuf->format == PIPE_FORMAT_Z16_UNORM) { + if (qs->softpipe->framebuffer.zsbuf.format == PIPE_FORMAT_Z16_UNORM) { switch (depthfunc) { case PIPE_FUNC_NEVER: qs->run = depth_test_quads_fallback; diff --git a/src/gallium/drivers/softpipe/sp_quad_pipe.c b/src/gallium/drivers/softpipe/sp_quad_pipe.c index b11be303f74..dda1bf981b3 100644 --- a/src/gallium/drivers/softpipe/sp_quad_pipe.c +++ b/src/gallium/drivers/softpipe/sp_quad_pipe.c @@ -44,7 +44,7 @@ sp_build_quad_pipeline(struct softpipe_context *sp) { bool early_depth_test = (sp->depth_stencil->depth_enabled && - sp->framebuffer.zsbuf && + sp->framebuffer.zsbuf.texture && !sp->depth_stencil->alpha_enabled && !sp->fs_variant->info.uses_kill && !sp->fs_variant->info.writes_z && @@ -63,4 +63,3 @@ sp_build_quad_pipeline(struct softpipe_context *sp) insert_stage_at_head( sp, sp->quad.shade ); } } - diff --git a/src/gallium/drivers/softpipe/sp_setup.c b/src/gallium/drivers/softpipe/sp_setup.c index c3c660ceed2..67c3b33a186 100644 --- a/src/gallium/drivers/softpipe/sp_setup.c +++ b/src/gallium/drivers/softpipe/sp_setup.c @@ -1381,8 +1381,8 @@ sp_setup_prepare(struct setup_context *setup) * attachment hence don't need separate per cbuf and zsbuf max. */ for (i = 0; i < setup->softpipe->framebuffer.nr_cbufs; i++) { - struct pipe_surface *cbuf = setup->softpipe->framebuffer.cbufs[i]; - if (cbuf) { + const struct pipe_surface *cbuf = &setup->softpipe->framebuffer.cbufs[i]; + if (cbuf->texture) { max_layer = MIN2(max_layer, cbuf->u.tex.last_layer - cbuf->u.tex.first_layer); diff --git a/src/gallium/drivers/softpipe/sp_state_surface.c b/src/gallium/drivers/softpipe/sp_state_surface.c index 4a83709016b..6855a60a06e 100644 --- a/src/gallium/drivers/softpipe/sp_state_surface.c +++ b/src/gallium/drivers/softpipe/sp_state_surface.c @@ -54,33 +54,23 @@ softpipe_set_framebuffer_state(struct pipe_context *pipe, draw_flush(sp->draw); for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { - struct pipe_surface *cb = i < fb->nr_cbufs ? fb->cbufs[i] : NULL; - /* check if changing cbuf */ - if (sp->framebuffer.cbufs[i] != cb) { + if (!pipe_surface_equal(&sp->framebuffer.cbufs[i], &fb->cbufs[i])) { /* flush old */ sp_flush_tile_cache(sp->cbuf_cache[i]); - /* assign new */ - pipe_surface_reference(&sp->framebuffer.cbufs[i], cb); - /* update cache */ - sp_tile_cache_set_surface(sp->cbuf_cache[i], cb); + sp_tile_cache_set_surface(sp->cbuf_cache[i], &fb->cbufs[i]); } } - sp->framebuffer.nr_cbufs = fb->nr_cbufs; - /* zbuf changing? */ - if (sp->framebuffer.zsbuf != fb->zsbuf) { + if (!pipe_surface_equal(&sp->framebuffer.zsbuf, &fb->zsbuf)) { /* flush old */ sp_flush_tile_cache(sp->zsbuf_cache); - /* assign new */ - pipe_surface_reference(&sp->framebuffer.zsbuf, fb->zsbuf); - /* update cache */ - sp_tile_cache_set_surface(sp->zsbuf_cache, fb->zsbuf); + sp_tile_cache_set_surface(sp->zsbuf_cache, &fb->zsbuf); /* Tell draw module how deep the Z/depth buffer is * @@ -88,14 +78,12 @@ softpipe_set_framebuffer_state(struct pipe_context *pipe, * format for no bound depth (PIPE_FORMAT_NONE). */ draw_set_zs_format(sp->draw, - (sp->framebuffer.zsbuf) ? - sp->framebuffer.zsbuf->format : PIPE_FORMAT_NONE); + (fb->zsbuf.texture) ? + fb->zsbuf.format : PIPE_FORMAT_NONE); } - sp->framebuffer.width = fb->width; - sp->framebuffer.height = fb->height; - sp->framebuffer.samples = fb->samples; - sp->framebuffer.layers = fb->layers; + util_copy_framebuffer_state(&sp->framebuffer, fb); + sp->dirty |= SP_NEW_FRAMEBUFFER | SP_NEW_TEXTURE; } diff --git a/src/gallium/drivers/softpipe/sp_surface.c b/src/gallium/drivers/softpipe/sp_surface.c index 4101ffada47..2f4b7b992bd 100644 --- a/src/gallium/drivers/softpipe/sp_surface.c +++ b/src/gallium/drivers/softpipe/sp_surface.c @@ -30,6 +30,7 @@ #include "sp_context.h" #include "sp_surface.h" #include "sp_query.h" +#include "sp_tile_cache.h" static void sp_blit(struct pipe_context *pipe, const struct pipe_blit_info *info) @@ -58,6 +59,18 @@ static void sp_blit(struct pipe_context *pipe, return; } + /* not sure why this is needed but it is */ + if (softpipe_is_resource_referenced(pipe, info->dst.resource, info->dst.level, info->dst.box.z) == SP_REFERENCED_FOR_WRITE) { + if (util_format_is_depth_or_stencil(info->dst.resource->format)) { + sp_flush_tile_cache(sp->zsbuf_cache); + } else { + for (int i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { + if (sp->framebuffer.cbufs[i].texture == info->dst.resource) + sp_flush_tile_cache(sp->cbuf_cache[i]); + } + } + } + /* XXX turn off occlusion and streamout queries */ util_blitter_save_vertex_buffers(sp->blitter, sp->vertex_buffer, diff --git a/src/gallium/drivers/softpipe/sp_tile_cache.c b/src/gallium/drivers/softpipe/sp_tile_cache.c index 9c3b6e7c3a7..2049b3b5c5a 100644 --- a/src/gallium/drivers/softpipe/sp_tile_cache.c +++ b/src/gallium/drivers/softpipe/sp_tile_cache.c @@ -165,13 +165,13 @@ sp_destroy_tile_cache(struct softpipe_tile_cache *tc) */ void sp_tile_cache_set_surface(struct softpipe_tile_cache *tc, - struct pipe_surface *ps) + const struct pipe_surface *ps) { struct pipe_context *pipe = tc->pipe; int i; if (tc->num_maps) { - if (ps == tc->surface) + if (pipe_surface_equal(ps, &tc->surface)) return; for (i = 0; i < tc->num_maps; i++) { @@ -187,9 +187,9 @@ sp_tile_cache_set_surface(struct softpipe_tile_cache *tc, tc->clear_flags_size = 0; } - tc->surface = ps; + tc->surface = *ps; - if (ps) { + if (ps->texture) { tc->num_maps = ps->u.tex.last_layer - ps->u.tex.first_layer + 1; tc->transfer = CALLOC(tc->num_maps, sizeof(struct pipe_transfer *)); tc->transfer_map = CALLOC(tc->num_maps, sizeof(void *)); @@ -218,17 +218,6 @@ sp_tile_cache_set_surface(struct softpipe_tile_cache *tc, } } - -/** - * Return the transfer being cached. - */ -struct pipe_surface * -sp_tile_cache_get_surface(struct softpipe_tile_cache *tc) -{ - return tc->surface; -} - - /** * Set pixels in a tile to the given clear color/value, float. */ @@ -370,7 +359,7 @@ sp_tile_cache_flush_clear(struct softpipe_tile_cache *tc, int layer) else { pipe_put_tile_rgba(pt, tc->transfer_map[layer], x, y, TILE_SIZE, TILE_SIZE, - tc->surface->format, + tc->surface.format, tc->tile->data.color); } numCleared++; @@ -401,7 +390,7 @@ sp_flush_tile(struct softpipe_tile_cache* tc, unsigned pos) tc->tile_addrs[pos].bits.x * TILE_SIZE, tc->tile_addrs[pos].bits.y * TILE_SIZE, TILE_SIZE, TILE_SIZE, - tc->surface->format, + tc->surface.format, tc->entries[pos]->data.color); } tc->tile_addrs[pos].bits.invalid = 1; /* mark as empty */ @@ -515,7 +504,7 @@ sp_find_cached_tile(struct softpipe_tile_cache *tc, tc->tile_addrs[pos].bits.x * TILE_SIZE, tc->tile_addrs[pos].bits.y * TILE_SIZE, TILE_SIZE, TILE_SIZE, - tc->surface->format, + tc->surface.format, tile->data.color); } } @@ -550,7 +539,7 @@ sp_find_cached_tile(struct softpipe_tile_cache *tc, tc->tile_addrs[pos].bits.x * TILE_SIZE, tc->tile_addrs[pos].bits.y * TILE_SIZE, TILE_SIZE, TILE_SIZE, - tc->surface->format, + tc->surface.format, tile->data.color); } } diff --git a/src/gallium/drivers/softpipe/sp_tile_cache.h b/src/gallium/drivers/softpipe/sp_tile_cache.h index dbb46d32d83..1a36cb6be32 100644 --- a/src/gallium/drivers/softpipe/sp_tile_cache.h +++ b/src/gallium/drivers/softpipe/sp_tile_cache.h @@ -82,7 +82,7 @@ struct softpipe_cached_tile struct softpipe_tile_cache { struct pipe_context *pipe; - struct pipe_surface *surface; /**< the surface we're caching */ + struct pipe_surface surface; /**< the surface we're caching */ struct pipe_transfer **transfer; void **transfer_map; int num_maps; @@ -110,10 +110,7 @@ sp_destroy_tile_cache(struct softpipe_tile_cache *tc); extern void sp_tile_cache_set_surface(struct softpipe_tile_cache *tc, - struct pipe_surface *sps); - -extern struct pipe_surface * -sp_tile_cache_get_surface(struct softpipe_tile_cache *tc); + const struct pipe_surface *sps); extern void sp_flush_tile_cache(struct softpipe_tile_cache *tc); @@ -159,4 +156,3 @@ sp_get_cached_tile(struct softpipe_tile_cache *tc, #endif /* SP_TILE_CACHE_H */ - diff --git a/src/gallium/drivers/svga/svga_context.c b/src/gallium/drivers/svga/svga_context.c index 9dacdabf9a3..ca7c9a5b535 100644 --- a/src/gallium/drivers/svga/svga_context.c +++ b/src/gallium/drivers/svga/svga_context.c @@ -257,8 +257,12 @@ svga_context_create(struct pipe_screen *screen, void *priv, unsigned flags) /* Avoid shortcircuiting state with initial value of zero. */ memset(&svga->state.hw_clear, 0xcd, sizeof(svga->state.hw_clear)); + // but some fields have to be zero/null: memset(&svga->state.hw_clear.framebuffer, 0x0, sizeof(svga->state.hw_clear.framebuffer)); + memset(&svga->state.hw_clear.fb_cbufs, 0x0, + sizeof(svga->state.hw_clear.fb_cbufs)); + svga->state.hw_clear.fb_zsbuf = NULL; memset(&svga->state.hw_clear.rtv, 0, sizeof(svga->state.hw_clear.rtv)); svga->state.hw_clear.num_rendertargets = 0; svga->state.hw_clear.dsv = NULL; diff --git a/src/gallium/drivers/svga/svga_context.h b/src/gallium/drivers/svga/svga_context.h index e410525bd49..7142dc15765 100644 --- a/src/gallium/drivers/svga/svga_context.h +++ b/src/gallium/drivers/svga/svga_context.h @@ -16,6 +16,7 @@ #include "util/os_time.h" #include "util/u_blitter.h" +#include "util/u_framebuffer.h" #include "util/list.h" #include "vm_basic_types.h" @@ -308,6 +309,7 @@ struct svga_state struct pipe_constant_buffer constbufs[PIPE_SHADER_TYPES][SVGA_MAX_CONST_BUFS]; struct svga_raw_buffer rawbufs[PIPE_SHADER_TYPES][SVGA_MAX_RAW_BUFS]; + PIPE_FB_SURFACES; //STOP USING THIS struct pipe_framebuffer_state framebuffer; float depthscale; @@ -376,6 +378,7 @@ struct svga_depthrange { */ struct svga_hw_clear_state { + PIPE_FB_SURFACES; //STOP USING THIS struct pipe_framebuffer_state framebuffer; /* VGPU9 only */ diff --git a/src/gallium/drivers/svga/svga_draw.c b/src/gallium/drivers/svga/svga_draw.c index 9bf0cfe7f92..cb17e2af593 100644 --- a/src/gallium/drivers/svga/svga_draw.c +++ b/src/gallium/drivers/svga/svga_draw.c @@ -252,8 +252,8 @@ draw_vgpu9(struct svga_hwtnl *hwtnl) } SVGA_DBG(DEBUG_DMA, "draw to sid %p, %d prims\n", - svga->curr.framebuffer.cbufs[0] ? - svga_surface(svga->curr.framebuffer.cbufs[0])->handle : NULL, + svga->curr.framebuffer.cbufs[0].texture ? + svga_surface(svga->curr.fb_cbufs[0])->handle : NULL, hwtnl->cmd.prim_count); ret = SVGA3D_BeginDrawPrimitives(swc, diff --git a/src/gallium/drivers/svga/svga_format.c b/src/gallium/drivers/svga/svga_format.c index c058ef1c39e..a62ab5af717 100644 --- a/src/gallium/drivers/svga/svga_format.c +++ b/src/gallium/drivers/svga/svga_format.c @@ -1886,9 +1886,9 @@ svga_has_any_integer_cbufs(const struct svga_context *svga) { unsigned i; for (i = 0; i < PIPE_MAX_COLOR_BUFS; ++i) { - struct pipe_surface *cbuf = svga->curr.framebuffer.cbufs[i]; + const struct pipe_surface *cbuf = &svga->curr.framebuffer.cbufs[i]; - if (cbuf && util_format_is_pure_integer(cbuf->format)) { + if (cbuf->texture && util_format_is_pure_integer(cbuf->format)) { return true; } } diff --git a/src/gallium/drivers/svga/svga_pipe_blit.c b/src/gallium/drivers/svga/svga_pipe_blit.c index 1b8df860847..43961d0f2f1 100644 --- a/src/gallium/drivers/svga/svga_pipe_blit.c +++ b/src/gallium/drivers/svga/svga_pipe_blit.c @@ -214,7 +214,7 @@ is_blending_enabled(struct svga_context *svga, if (svga->curr.blend) { if (svga->curr.blend->independent_blend_enable) { for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) { - struct pipe_surface *cbuf = svga->curr.framebuffer.cbufs[i]; + struct pipe_surface *cbuf = &svga->curr.framebuffer.cbufs[i]; if (cbuf && (cbuf->texture == blit->dst.resource)) { if (svga->curr.blend->rt[i].blend_enable) { blend_enable = true; diff --git a/src/gallium/drivers/svga/svga_pipe_clear.c b/src/gallium/drivers/svga/svga_pipe_clear.c index 042833bf428..5e61c233f80 100644 --- a/src/gallium/drivers/svga/svga_pipe_clear.c +++ b/src/gallium/drivers/svga/svga_pipe_clear.c @@ -79,8 +79,8 @@ is_integer_target(struct pipe_framebuffer_state *fb, unsigned buffers) for (i = 0; i < fb->nr_cbufs; i++) { if ((buffers & (PIPE_CLEAR_COLOR0 << i)) && - fb->cbufs[i] && - util_format_is_pure_integer(fb->cbufs[i]->format)) { + fb->cbufs[i].texture && + util_format_is_pure_integer(fb->cbufs[i].format)) { return true; } } @@ -137,14 +137,14 @@ try_clear(struct svga_context *svga, rect.h = fb->height; } - if ((buffers & PIPE_CLEAR_DEPTHSTENCIL) && fb->zsbuf) { + if ((buffers & PIPE_CLEAR_DEPTHSTENCIL) && fb->zsbuf.texture) { if (buffers & PIPE_CLEAR_DEPTH) flags |= SVGA3D_CLEAR_DEPTH; if (buffers & PIPE_CLEAR_STENCIL) flags |= SVGA3D_CLEAR_STENCIL; - rect.w = MAX2(rect.w, pipe_surface_width(fb->zsbuf)); - rect.h = MAX2(rect.h, pipe_surface_height(fb->zsbuf)); + rect.w = MAX2(rect.w, pipe_surface_width(&fb->zsbuf)); + rect.h = MAX2(rect.h, pipe_surface_height(&fb->zsbuf)); } if (!svga_have_vgpu10(svga) && @@ -184,12 +184,12 @@ try_clear(struct svga_context *svga, /* Issue VGPU10 Clear commands */ for (i = 0; i < fb->nr_cbufs; i++) { - if ((fb->cbufs[i] == NULL) || + if ((fb->cbufs[i].texture == NULL) || !(buffers & (PIPE_CLEAR_COLOR0 << i))) continue; rtv = svga_validate_surface_view(svga, - svga_surface(fb->cbufs[i])); + svga_surface(svga->curr.fb_cbufs[i])); if (!rtv) return PIPE_ERROR_OUT_OF_MEMORY; @@ -201,7 +201,7 @@ try_clear(struct svga_context *svga, } if (flags & (SVGA3D_CLEAR_DEPTH | SVGA3D_CLEAR_STENCIL)) { struct pipe_surface *dsv = - svga_validate_surface_view(svga, svga_surface(fb->zsbuf)); + svga_validate_surface_view(svga, svga_surface(svga->curr.fb_zsbuf)); if (!dsv) return PIPE_ERROR_OUT_OF_MEMORY; @@ -239,8 +239,8 @@ svga_clear(struct pipe_context *pipe, unsigned buffers, const struct pipe_scisso if (buffers & PIPE_CLEAR_COLOR) { struct svga_winsys_surface *h = NULL; - if (svga->curr.framebuffer.cbufs[0]) { - h = svga_surface(svga->curr.framebuffer.cbufs[0])->handle; + if (svga->curr.fb_cbufs[0]) { + h = svga_surface(svga->curr.fb_cbufs[0])->handle; } SVGA_DBG(DEBUG_DMA, "clear sid %p\n", h); } diff --git a/src/gallium/drivers/svga/svga_pipe_flush.c b/src/gallium/drivers/svga/svga_pipe_flush.c index 5b11ada5a3e..3379c0e82c2 100644 --- a/src/gallium/drivers/svga/svga_pipe_flush.c +++ b/src/gallium/drivers/svga/svga_pipe_flush.c @@ -43,12 +43,12 @@ static void svga_flush( struct pipe_context *pipe, for (i = 0; i < fb->nr_cbufs; i++) { snprintf(filename, sizeof(filename), "cbuf%u_%04u.bmp", i, frame_no); - debug_dump_surface_bmp(&svga->pipe, filename, fb->cbufs[i]); + debug_dump_surface_bmp(&svga->pipe, filename, &fb->cbufs[i]); } - if (0 && fb->zsbuf) { + if (0 && fb->zsbuf.texture) { snprintf(filename, sizeof(filename), "zsbuf_%04u.bmp", frame_no); - debug_dump_surface_bmp(&svga->pipe, filename, fb->zsbuf); + debug_dump_surface_bmp(&svga->pipe, filename, &fb->zsbuf); } ++frame_no; diff --git a/src/gallium/drivers/svga/svga_pipe_misc.c b/src/gallium/drivers/svga/svga_pipe_misc.c index 195c555b83c..dcd31ca6d32 100644 --- a/src/gallium/drivers/svga/svga_pipe_misc.c +++ b/src/gallium/drivers/svga/svga_pipe_misc.c @@ -76,6 +76,7 @@ svga_cleanup_framebuffer(struct svga_context *svga) struct pipe_framebuffer_state *curr = &svga->curr.framebuffer; struct pipe_framebuffer_state *hw = &svga->state.hw_clear.framebuffer; + util_framebuffer_init(&svga->pipe, NULL, svga->curr.fb_cbufs, &svga->curr.fb_zsbuf); util_unreference_framebuffer_state(curr); util_unreference_framebuffer_state(hw); } @@ -109,14 +110,14 @@ svga_set_framebuffer_state(struct pipe_context *pipe, */ { uint16_t width = 0, height = 0; - if (fb->zsbuf) { - pipe_surface_size(fb->zsbuf, &width, &height); + if (fb->zsbuf.texture) { + pipe_surface_size(&fb->zsbuf, &width, &height); } for (i = 0; i < fb->nr_cbufs; ++i) { - if (fb->cbufs[i]) { + if (fb->cbufs[i].texture) { if (width && height) { uint16_t cwidth, cheight; - pipe_surface_size(fb->cbufs[i], &cwidth, &cheight); + pipe_surface_size(&fb->cbufs[i], &cwidth, &cheight); if (cwidth != width || cheight != height) { debug_warning("Mixed-size color and depth/stencil surfaces " @@ -124,16 +125,17 @@ svga_set_framebuffer_state(struct pipe_context *pipe, } } else { - pipe_surface_size(fb->cbufs[i], &width, &height); + pipe_surface_size(&fb->cbufs[i], &width, &height); } } } } + util_framebuffer_init(pipe, fb, svga->curr.fb_cbufs, &svga->curr.fb_zsbuf); util_copy_framebuffer_state(dst, fb); - if (svga->curr.framebuffer.zsbuf) { - switch (svga->curr.framebuffer.zsbuf->format) { + if (svga->curr.framebuffer.zsbuf.texture) { + switch (svga->curr.framebuffer.zsbuf.texture->format) { case PIPE_FORMAT_Z16_UNORM: svga->curr.depthscale = 1.0f / DEPTH_BIAS_SCALE_FACTOR_D16; break; diff --git a/src/gallium/drivers/svga/svga_state_framebuffer.c b/src/gallium/drivers/svga/svga_state_framebuffer.c index 41357e5078a..c61d4a89545 100644 --- a/src/gallium/drivers/svga/svga_state_framebuffer.c +++ b/src/gallium/drivers/svga/svga_state_framebuffer.c @@ -50,42 +50,42 @@ emit_fb_vgpu9(struct svga_context *svga) */ for (i = 0; i < svgascreen->max_color_buffers; i++) { - if ((curr->cbufs[i] != hw->cbufs[i]) || (reemit && hw->cbufs[i])) { + if (!pipe_surface_equal(&curr->cbufs[i], &hw->cbufs[i]) || (reemit && svga->state.hw_clear.fb_cbufs[i])) { if (svga->curr.nr_fbs++ > MAX_RT_PER_BATCH) return PIPE_ERROR_OUT_OF_MEMORY; /* Check to see if we need to propagate the render target surface */ - if (hw->cbufs[i] && svga_surface_needs_propagation(hw->cbufs[i])) - svga_propagate_surface(svga, hw->cbufs[i], true); + if (svga->state.hw_clear.fb_cbufs[i] && svga_surface_needs_propagation(svga->state.hw_clear.fb_cbufs[i])) + svga_propagate_surface(svga, svga->state.hw_clear.fb_cbufs[i], true); ret = SVGA3D_SetRenderTarget(svga->swc, SVGA3D_RT_COLOR0 + i, - curr->cbufs[i]); + svga->curr.fb_cbufs[i]); if (ret != PIPE_OK) return ret; - pipe_surface_reference(&hw->cbufs[i], curr->cbufs[i]); + pipe_surface_reference(&svga->state.hw_clear.fb_cbufs[i], svga->curr.fb_cbufs[i]); } /* Set the rendered-to flag */ - struct pipe_surface *s = curr->cbufs[i]; - if (s) { + struct pipe_surface *s = svga->curr.fb_cbufs[i]; + if (s->texture) { svga_set_texture_rendered_to(svga_texture(s->texture)); } } - if ((curr->zsbuf != hw->zsbuf) || (reemit && hw->zsbuf)) { - ret = SVGA3D_SetRenderTarget(svga->swc, SVGA3D_RT_DEPTH, curr->zsbuf); + if (!pipe_surface_equal(&curr->zsbuf, &hw->zsbuf) || (reemit && svga->state.hw_clear.fb_zsbuf)) { + ret = SVGA3D_SetRenderTarget(svga->swc, SVGA3D_RT_DEPTH, svga->curr.fb_zsbuf); if (ret != PIPE_OK) return ret; /* Check to see if we need to propagate the depth stencil surface */ - if (hw->zsbuf && svga_surface_needs_propagation(hw->zsbuf)) - svga_propagate_surface(svga, hw->zsbuf, true); + if (hw->zsbuf.texture && svga_surface_needs_propagation(svga->state.hw_clear.fb_zsbuf)) + svga_propagate_surface(svga, svga->state.hw_clear.fb_zsbuf, true); - if (curr->zsbuf && - util_format_is_depth_and_stencil(curr->zsbuf->format)) { + if (curr->zsbuf.texture && + util_format_is_depth_and_stencil(curr->zsbuf.format)) { ret = SVGA3D_SetRenderTarget(svga->swc, SVGA3D_RT_STENCIL, - curr->zsbuf); + svga->curr.fb_zsbuf); if (ret != PIPE_OK) return ret; } @@ -95,11 +95,11 @@ emit_fb_vgpu9(struct svga_context *svga) return ret; } - pipe_surface_reference(&hw->zsbuf, curr->zsbuf); + pipe_surface_reference(&svga->state.hw_clear.fb_zsbuf, svga->curr.fb_zsbuf); /* Set the rendered-to flag */ - struct pipe_surface *s = curr->zsbuf; - if (s) { + struct pipe_surface *s = svga->curr.fb_zsbuf; + if (s->texture) { svga_set_texture_rendered_to(svga_texture(s->texture)); } } @@ -120,31 +120,30 @@ static enum pipe_error svga_reemit_framebuffer_bindings_vgpu9(struct svga_context *svga) { struct svga_screen *svgascreen = svga_screen(svga->pipe.screen); - struct pipe_framebuffer_state *hw = &svga->state.hw_clear.framebuffer; unsigned i; enum pipe_error ret; assert(!svga_have_vgpu10(svga)); for (i = 0; i < svgascreen->max_color_buffers; i++) { - if (hw->cbufs[i]) { + if (svga->state.hw_clear.fb_cbufs[i]) { ret = SVGA3D_SetRenderTarget(svga->swc, SVGA3D_RT_COLOR0 + i, - hw->cbufs[i]); + svga->state.hw_clear.fb_cbufs[i]); if (ret != PIPE_OK) { return ret; } } } - if (hw->zsbuf) { - ret = SVGA3D_SetRenderTarget(svga->swc, SVGA3D_RT_DEPTH, hw->zsbuf); + if (svga->state.hw_clear.fb_zsbuf) { + ret = SVGA3D_SetRenderTarget(svga->swc, SVGA3D_RT_DEPTH, svga->state.hw_clear.fb_zsbuf); if (ret != PIPE_OK) { return ret; } - if (hw->zsbuf && - util_format_is_depth_and_stencil(hw->zsbuf->format)) { - ret = SVGA3D_SetRenderTarget(svga->swc, SVGA3D_RT_STENCIL, hw->zsbuf); + if (svga->state.hw_clear.fb_zsbuf && + util_format_is_depth_and_stencil(svga->state.hw_clear.fb_zsbuf->format)) { + ret = SVGA3D_SetRenderTarget(svga->swc, SVGA3D_RT_STENCIL, svga->state.hw_clear.fb_zsbuf); if (ret != PIPE_OK) { return ret; } @@ -189,10 +188,10 @@ emit_fb_vgpu10(struct svga_context *svga) * than the old number of buffers. */ for (i = 0; i < num_color; i++) { - if (curr->cbufs[i]) { - struct pipe_surface *s = curr->cbufs[i]; + if (curr->cbufs[i].texture) { + struct pipe_surface *s = svga->curr.fb_cbufs[i]; - if (curr->cbufs[i] != hw->cbufs[i]) { + if (!pipe_surface_equal(&curr->cbufs[i], &hw->cbufs[i])) { rtv[i] = svga_validate_surface_view(svga, svga_surface(s)); if (rtv[i] == NULL) { return PIPE_ERROR_OUT_OF_MEMORY; @@ -213,11 +212,11 @@ emit_fb_vgpu10(struct svga_context *svga) } /* Setup depth stencil view */ - if (curr->zsbuf) { - struct pipe_surface *s = curr->zsbuf; + if (curr->zsbuf.texture) { + struct pipe_surface *s = svga->curr.fb_zsbuf; - if (curr->zsbuf != hw->zsbuf) { - dsv = svga_validate_surface_view(svga, svga_surface(curr->zsbuf)); + if (svga->curr.fb_zsbuf != svga->state.hw_clear.fb_zsbuf) { + dsv = svga_validate_surface_view(svga, svga_surface(svga->curr.fb_zsbuf)); if (!dsv) { return PIPE_ERROR_OUT_OF_MEMORY; } @@ -245,39 +244,41 @@ emit_fb_vgpu10(struct svga_context *svga) * unbound render targets. */ for (i = 0; i < ss->max_color_buffers; i++) { - if (hw->cbufs[i] != curr->cbufs[i]) { + if (!pipe_surface_equal(&hw->cbufs[i], &curr->cbufs[i])) { /* propagate the backed view surface before unbinding it */ - if (hw->cbufs[i] && svga_surface(hw->cbufs[i])->backed) { + if (hw->cbufs[i].texture && svga_surface(svga->state.hw_clear.fb_cbufs[i])->backed) { svga_propagate_surface(svga, - &svga_surface(hw->cbufs[i])->backed->base, + &svga_surface(svga->state.hw_clear.fb_cbufs[i])->backed->base, true); } - else if (svga->state.hw_clear.rtv[i] != hw->cbufs[i] && + else if (svga->state.hw_clear.rtv[i] != svga->state.hw_clear.fb_cbufs[i] && svga->state.hw_clear.rtv[i]) { /* Free the alternate surface view when it is unbound. */ - svga->pipe.surface_destroy(&svga->pipe, svga->state.hw_clear.rtv[i]); + pipe_surface_unref(&svga->pipe, &svga->state.hw_clear.rtv[i]); } - pipe_surface_reference(&hw->cbufs[i], curr->cbufs[i]); + pipe_surface_reference(&svga->state.hw_clear.fb_cbufs[i], svga->curr.fb_cbufs[i]); } } svga->state.hw_clear.num_rendertargets = last_rtv + 1; - memcpy(svga->state.hw_clear.rtv, rtv, num_color * sizeof(rtv[0])); + for (unsigned i = 0; i < num_color; i++) { + pipe_surface_reference(&svga->state.hw_clear.rtv[i], rtv[i]); + } hw->nr_cbufs = curr->nr_cbufs; - if (hw->zsbuf != curr->zsbuf) { + if (!pipe_surface_equal(&hw->zsbuf, &curr->zsbuf)) { /* propagate the backed view surface before unbinding it */ - if (hw->zsbuf && svga_surface(hw->zsbuf)->backed) { + if (svga->state.hw_clear.fb_zsbuf && svga_surface(svga->state.hw_clear.fb_zsbuf)->backed) { svga_propagate_surface(svga, - &svga_surface(hw->zsbuf)->backed->base, + &svga_surface(svga->state.hw_clear.fb_zsbuf)->backed->base, true); } - else if (svga->state.hw_clear.dsv != hw->zsbuf && svga->state.hw_clear.dsv) { + else if (svga->state.hw_clear.dsv != svga->state.hw_clear.fb_zsbuf && svga->state.hw_clear.dsv) { /* Free the alternate surface view when it is unbound. */ svga->pipe.surface_destroy(&svga->pipe, svga->state.hw_clear.dsv); } - pipe_surface_reference(&hw->zsbuf, curr->zsbuf); + pipe_surface_reference(&svga->state.hw_clear.fb_zsbuf, svga->curr.fb_zsbuf); } - svga->state.hw_clear.dsv = dsv; + pipe_surface_reference(&svga->state.hw_clear.dsv, dsv); } return ret; diff --git a/src/gallium/drivers/svga/svga_state_rss.c b/src/gallium/drivers/svga/svga_state_rss.c index 411d3433753..96e8d019187 100644 --- a/src/gallium/drivers/svga/svga_state_rss.c +++ b/src/gallium/drivers/svga/svga_state_rss.c @@ -247,7 +247,7 @@ emit_rss_vgpu9(struct svga_context *svga, uint64_t dirty) * pipeline is active. */ if (!svga->state.sw.need_pipeline && - svga->curr.framebuffer.zsbuf) + svga->curr.framebuffer.zsbuf.texture) { slope = curr->slopescaledepthbias; bias = svga->curr.depthscale * curr->depthbias; @@ -260,8 +260,8 @@ emit_rss_vgpu9(struct svga_context *svga, uint64_t dirty) if (dirty & SVGA_NEW_FRAME_BUFFER) { /* XXX: we only look at the first color buffer's sRGB state */ float gamma = 1.0f; - if (svga->curr.framebuffer.cbufs[0] && - util_format_is_srgb(svga->curr.framebuffer.cbufs[0]->format)) { + if (svga->curr.framebuffer.cbufs[0].texture && + util_format_is_srgb(svga->curr.framebuffer.cbufs[0].format)) { gamma = 2.2f; } EMIT_RS_FLOAT(svga, gamma, OUTPUTGAMMA); @@ -480,7 +480,7 @@ emit_rss_vgpu10(struct svga_context *svga, uint64_t dirty) * specified in forcedSampleCount in the RasterizerState_v2 object. */ if ((svga->curr.framebuffer.nr_cbufs == 0) && - (svga->curr.framebuffer.zsbuf == NULL)) { + (svga->curr.framebuffer.zsbuf.texture == NULL)) { rastId = get_alt_rasterizer_state_id(svga, rast, svga->curr.framebuffer.samples); diff --git a/src/gallium/drivers/svga/svga_state_sampler.c b/src/gallium/drivers/svga/svga_state_sampler.c index 5f314fd6c86..5b6c2e2f06d 100644 --- a/src/gallium/drivers/svga/svga_state_sampler.c +++ b/src/gallium/drivers/svga/svga_state_sampler.c @@ -86,7 +86,7 @@ svga_check_sampler_framebuffer_resource_collision(struct svga_context *svga, unsigned i; for (i = 0; i < svga->curr.framebuffer.nr_cbufs; i++) { - surf = svga_surface(svga->curr.framebuffer.cbufs[i]); + surf = svga_surface(svga->curr.fb_cbufs[i]); if (surf && svga_check_sampler_view_resource_collision(svga, surf->handle, shader)) { @@ -94,7 +94,7 @@ svga_check_sampler_framebuffer_resource_collision(struct svga_context *svga, } } - surf = svga_surface(svga->curr.framebuffer.zsbuf); + surf = svga_surface(svga->curr.fb_zsbuf); if (surf && svga_check_sampler_view_resource_collision(svga, surf->handle, shader)) { return true; diff --git a/src/gallium/drivers/svga/svga_surface.c b/src/gallium/drivers/svga/svga_surface.c index e989276179f..0148230ad9d 100644 --- a/src/gallium/drivers/svga/svga_surface.c +++ b/src/gallium/drivers/svga/svga_surface.c @@ -66,7 +66,7 @@ svga_texture_copy_handle(struct svga_context *svga, unsigned dst_level, unsigned dst_layer, unsigned width, unsigned height, unsigned depth) { - struct svga_surface dst, src; + struct svga_surface dst = { 0 }, src = { 0 }; SVGA3dCopyBox box, *boxes; assert(svga); @@ -650,8 +650,7 @@ svga_surface_destroy(struct pipe_context *pipe, /* Destroy the backed view surface if it exists */ if (s->backed) { - svga_surface_destroy(pipe, &s->backed->base); - s->backed = NULL; + pipe_surface_unref(pipe, (struct pipe_surface **) &s->backed); } /* Destroy the surface handle if this is a backed handle and @@ -744,11 +743,11 @@ svga_mark_surfaces_dirty(struct svga_context *svga) svga_mark_surface_dirty(hw->dsv); } else { for (i = 0; i < svga->curr.framebuffer.nr_cbufs; i++) { - if (svga->curr.framebuffer.cbufs[i]) - svga_mark_surface_dirty(svga->curr.framebuffer.cbufs[i]); + if (svga->curr.framebuffer.cbufs[i].texture) + svga_mark_surface_dirty(svga->curr.fb_cbufs[i]); } - if (svga->curr.framebuffer.zsbuf) - svga_mark_surface_dirty(svga->curr.framebuffer.zsbuf); + if (svga->curr.framebuffer.zsbuf.texture) + svga_mark_surface_dirty(svga->curr.fb_zsbuf); } } diff --git a/src/gallium/drivers/svga/svga_swtnl_state.c b/src/gallium/drivers/svga/svga_swtnl_state.c index 2bf2cc89c8a..be6aac37594 100644 --- a/src/gallium/drivers/svga/svga_swtnl_state.c +++ b/src/gallium/drivers/svga/svga_swtnl_state.c @@ -125,8 +125,8 @@ update_swtnl_draw(struct svga_context *svga, uint64_t dirty) */ if (dirty & SVGA_NEW_FRAME_BUFFER) draw_set_zs_format(svga->swtnl.draw, - (svga->curr.framebuffer.zsbuf) ? - svga->curr.framebuffer.zsbuf->format : PIPE_FORMAT_NONE); + (svga->curr.framebuffer.zsbuf.texture) ? + svga->curr.framebuffer.zsbuf.format : PIPE_FORMAT_NONE); SVGA_STATS_TIME_POP(svga_sws(svga)); return PIPE_OK; diff --git a/src/gallium/drivers/tegra/tegra_context.c b/src/gallium/drivers/tegra/tegra_context.c index 467c3a12339..c961d090ba6 100644 --- a/src/gallium/drivers/tegra/tegra_context.c +++ b/src/gallium/drivers/tegra/tegra_context.c @@ -496,22 +496,6 @@ tegra_set_framebuffer_state(struct pipe_context *pcontext, const struct pipe_framebuffer_state *fb) { struct tegra_context *context = to_tegra_context(pcontext); - struct pipe_framebuffer_state state; - unsigned i; - - if (fb) { - memcpy(&state, fb, sizeof(state)); - - for (i = 0; i < fb->nr_cbufs; i++) - state.cbufs[i] = tegra_surface_unwrap(fb->cbufs[i]); - - while (i < PIPE_MAX_COLOR_BUFS) - state.cbufs[i++] = NULL; - - state.zsbuf = tegra_surface_unwrap(fb->zsbuf); - - fb = &state; - } context->gpu->set_framebuffer_state(context->gpu, fb); } diff --git a/src/gallium/drivers/v3d/v3d_context.c b/src/gallium/drivers/v3d/v3d_context.c index 6abda780262..dc19ba8cedb 100644 --- a/src/gallium/drivers/v3d/v3d_context.c +++ b/src/gallium/drivers/v3d/v3d_context.c @@ -187,8 +187,8 @@ v3d_line_smoothing_enabled(struct v3d_context *v3d) if (v3d->framebuffer.nr_cbufs <= 0) return false; - struct pipe_surface *cbuf = v3d->framebuffer.cbufs[0]; - if (!cbuf) + const struct pipe_surface *cbuf = &v3d->framebuffer.cbufs[0]; + if (!cbuf->texture) return false; /* Modifying the alpha for pure integer formats probably @@ -315,6 +315,7 @@ v3d_context_destroy(struct pipe_context *pctx) slab_destroy_child(&v3d->transfer_pool); + util_framebuffer_init(pctx, NULL, v3d->fb_cbufs, &v3d->fb_zsbuf); util_unreference_framebuffer_state(&v3d->framebuffer); if (v3d->sand8_blit_vs) diff --git a/src/gallium/drivers/v3d/v3d_context.h b/src/gallium/drivers/v3d/v3d_context.h index 2f9172e1d57..f62ad98b857 100644 --- a/src/gallium/drivers/v3d/v3d_context.h +++ b/src/gallium/drivers/v3d/v3d_context.h @@ -36,6 +36,7 @@ #include "util/bitset.h" #include "util/slab.h" #include "util/u_dynarray.h" +#include "util/u_framebuffer.h" #include "xf86drm.h" #include "drm-uapi/v3d_drm.h" #include "v3d_screen.h" @@ -633,6 +634,7 @@ struct v3d_context { } blend_color; struct pipe_stencil_ref stencil_ref; unsigned sample_mask; + PIPE_FB_SURFACES; //STOP USING THIS struct pipe_framebuffer_state framebuffer; /* Per render target, whether we should swap the R and B fields in the diff --git a/src/gallium/drivers/v3d/v3d_job.c b/src/gallium/drivers/v3d/v3d_job.c index ae827d9091b..7e919c41d65 100644 --- a/src/gallium/drivers/v3d/v3d_job.c +++ b/src/gallium/drivers/v3d/v3d_job.c @@ -396,8 +396,8 @@ v3d_get_job_for_fbo(struct v3d_context *v3d) return v3d->job; uint32_t nr_cbufs = v3d->framebuffer.nr_cbufs; - struct pipe_surface **cbufs = v3d->framebuffer.cbufs; - struct pipe_surface *zsbuf = v3d->framebuffer.zsbuf; + struct pipe_surface **cbufs = v3d->fb_cbufs; + struct pipe_surface *zsbuf = v3d->fb_zsbuf; struct v3d_job *job = v3d_get_job(v3d, nr_cbufs, cbufs, zsbuf, NULL); if (v3d->framebuffer.samples >= 1) { @@ -753,4 +753,3 @@ v3d_job_init(struct v3d_context *v3d) _mesa_hash_pointer, _mesa_key_pointer_equal); } - diff --git a/src/gallium/drivers/v3d/v3d_program.c b/src/gallium/drivers/v3d/v3d_program.c index edcd601af28..b7e507a2777 100644 --- a/src/gallium/drivers/v3d/v3d_program.c +++ b/src/gallium/drivers/v3d/v3d_program.c @@ -631,8 +631,8 @@ v3d_update_compiled_fs(struct v3d_context *v3d, uint8_t prim_mode) key->software_blend = v3d->blend->use_software; for (int i = 0; i < v3d->framebuffer.nr_cbufs; i++) { - struct pipe_surface *cbuf = v3d->framebuffer.cbufs[i]; - if (!cbuf) + const struct pipe_surface *cbuf = &v3d->framebuffer.cbufs[i]; + if (!cbuf->texture) continue; /* gl_FragColor's propagation to however many bound color diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c index 7400358e881..1b0d3dd4d72 100644 --- a/src/gallium/drivers/v3d/v3dx_draw.c +++ b/src/gallium/drivers/v3d/v3dx_draw.c @@ -1693,7 +1693,7 @@ v3d_tlb_clear(struct v3d_job *job, unsigned buffers, if (!(buffers & bit)) continue; - struct pipe_surface *psurf = v3d->framebuffer.cbufs[i]; + struct pipe_surface *psurf = v3d->fb_cbufs[i]; struct v3d_surface *surf = v3d_surface(psurf); struct v3d_resource *rsc = v3d_resource(psurf->texture); @@ -1759,7 +1759,7 @@ v3d_tlb_clear(struct v3d_job *job, unsigned buffers, unsigned zsclear = buffers & PIPE_CLEAR_DEPTHSTENCIL; if (zsclear) { struct v3d_resource *rsc = - v3d_resource(v3d->framebuffer.zsbuf->texture); + v3d_resource(v3d->framebuffer.zsbuf.texture); if (zsclear & PIPE_CLEAR_DEPTH) job->clear_z = depth; diff --git a/src/gallium/drivers/v3d/v3dx_state.c b/src/gallium/drivers/v3d/v3dx_state.c index 4215d746407..2c9f6c0c409 100644 --- a/src/gallium/drivers/v3d/v3dx_state.c +++ b/src/gallium/drivers/v3d/v3dx_state.c @@ -519,13 +519,14 @@ v3d_set_framebuffer_state(struct pipe_context *pctx, v3d->job = NULL; + util_framebuffer_init(pctx, framebuffer, v3d->fb_cbufs, &v3d->fb_zsbuf); util_copy_framebuffer_state(cso, framebuffer); v3d->swap_color_rb = 0; v3d->blend_dst_alpha_one = 0; for (int i = 0; i < v3d->framebuffer.nr_cbufs; i++) { - struct pipe_surface *cbuf = v3d->framebuffer.cbufs[i]; - if (!cbuf) + const struct pipe_surface *cbuf = &v3d->framebuffer.cbufs[i]; + if (!cbuf->texture) continue; const struct util_format_description *desc = diff --git a/src/gallium/drivers/vc4/vc4_context.c b/src/gallium/drivers/vc4/vc4_context.c index 472a3e1b0e3..012209a1bf2 100644 --- a/src/gallium/drivers/vc4/vc4_context.c +++ b/src/gallium/drivers/vc4/vc4_context.c @@ -116,6 +116,7 @@ vc4_context_destroy(struct pipe_context *pctx) slab_destroy_child(&vc4->transfer_pool); + util_framebuffer_init(pctx, NULL, vc4->fb_cbufs, &vc4->fb_zsbuf); util_unreference_framebuffer_state(&vc4->framebuffer); if (vc4->yuv_linear_blit_vs) diff --git a/src/gallium/drivers/vc4/vc4_context.h b/src/gallium/drivers/vc4/vc4_context.h index 547ab3ef17e..a80f5cb4916 100644 --- a/src/gallium/drivers/vc4/vc4_context.h +++ b/src/gallium/drivers/vc4/vc4_context.h @@ -29,6 +29,7 @@ #include "pipe/p_context.h" #include "pipe/p_state.h" +#include "util/u_framebuffer.h" #include "util/slab.h" #include "util/u_debug_cb.h" #include "xf86drm.h" @@ -370,6 +371,7 @@ struct vc4_context { } blend_color; struct pipe_stencil_ref stencil_ref; unsigned sample_mask; + PIPE_FB_SURFACES; //STOP USING THIS struct pipe_framebuffer_state framebuffer; struct pipe_poly_stipple stipple; struct pipe_clip_state clip; diff --git a/src/gallium/drivers/vc4/vc4_draw.c b/src/gallium/drivers/vc4/vc4_draw.c index 79af1495847..e4b30a9a0fc 100644 --- a/src/gallium/drivers/vc4/vc4_draw.c +++ b/src/gallium/drivers/vc4/vc4_draw.c @@ -501,9 +501,9 @@ vc4_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info, */ assert(job->draw_calls_queued <= VC4_HW_2116_COUNT); - if (vc4->zsa && vc4->framebuffer.zsbuf) { + if (vc4->zsa && vc4->framebuffer.zsbuf.texture) { struct vc4_resource *rsc = - vc4_resource(vc4->framebuffer.zsbuf->texture); + vc4_resource(vc4->framebuffer.zsbuf.texture); if (vc4->zsa->base.depth_enabled) { job->resolve |= PIPE_CLEAR_DEPTH; @@ -549,7 +549,7 @@ vc4_clear(struct pipe_context *pctx, unsigned buffers, const struct pipe_scissor if (buffers & PIPE_CLEAR_DEPTHSTENCIL) { struct vc4_resource *rsc = - vc4_resource(vc4->framebuffer.zsbuf->texture); + vc4_resource(vc4->framebuffer.zsbuf.texture); unsigned zsclear = buffers & PIPE_CLEAR_DEPTHSTENCIL; /* Clearing ZS will clear both Z and stencil, so if we're @@ -561,7 +561,7 @@ vc4_clear(struct pipe_context *pctx, unsigned buffers, const struct pipe_scissor if ((zsclear == PIPE_CLEAR_DEPTH || zsclear == PIPE_CLEAR_STENCIL) && (rsc->initialized_buffers & ~(zsclear | job->cleared)) && - util_format_is_depth_and_stencil(vc4->framebuffer.zsbuf->format)) { + util_format_is_depth_and_stencil(vc4->framebuffer.zsbuf.format)) { static const union pipe_color_union dummy_color = {}; perf_debug("Partial clear of Z+stencil buffer, " @@ -592,10 +592,10 @@ vc4_clear(struct pipe_context *pctx, unsigned buffers, const struct pipe_scissor if (buffers & PIPE_CLEAR_COLOR0) { struct vc4_resource *rsc = - vc4_resource(vc4->framebuffer.cbufs[0]->texture); + vc4_resource(vc4->framebuffer.cbufs[0].texture); uint32_t clear_color; - if (vc4_rt_format_is_565(vc4->framebuffer.cbufs[0]->format)) { + if (vc4_rt_format_is_565(vc4->framebuffer.cbufs[0].format)) { /* In 565 mode, the hardware will be packing our color * for us. */ @@ -606,7 +606,7 @@ vc4_clear(struct pipe_context *pctx, unsigned buffers, const struct pipe_scissor * support multiple swizzlings of RGBA8888. */ clear_color = - pack_rgba(vc4->framebuffer.cbufs[0]->format, + pack_rgba(vc4->framebuffer.cbufs[0].format, color->f); } job->clear_color[0] = job->clear_color[1] = clear_color; @@ -615,7 +615,7 @@ vc4_clear(struct pipe_context *pctx, unsigned buffers, const struct pipe_scissor if (buffers & PIPE_CLEAR_DEPTHSTENCIL) { struct vc4_resource *rsc = - vc4_resource(vc4->framebuffer.zsbuf->texture); + vc4_resource(vc4->framebuffer.zsbuf.texture); /* Though the depth buffer is stored with Z in the high 24, * for this field we just need to store it in the low 24. diff --git a/src/gallium/drivers/vc4/vc4_job.c b/src/gallium/drivers/vc4/vc4_job.c index a2150ec48be..b484470b872 100644 --- a/src/gallium/drivers/vc4/vc4_job.c +++ b/src/gallium/drivers/vc4/vc4_job.c @@ -234,8 +234,8 @@ vc4_get_job_for_fbo(struct vc4_context *vc4) if (vc4->job) return vc4->job; - struct pipe_surface *cbuf = vc4->framebuffer.cbufs[0]; - struct pipe_surface *zsbuf = vc4->framebuffer.zsbuf; + struct pipe_surface *cbuf = vc4->fb_cbufs[0]; + struct pipe_surface *zsbuf = vc4->fb_zsbuf; struct vc4_job *job = vc4_get_job(vc4, cbuf, zsbuf); /* The dirty flags are tracking what's been updated while vc4->job has @@ -572,4 +572,3 @@ vc4_job_init(struct vc4_context *vc4) return 0; } - diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c index cc9647b44ad..2a14b997373 100644 --- a/src/gallium/drivers/vc4/vc4_program.c +++ b/src/gallium/drivers/vc4/vc4_program.c @@ -2808,8 +2808,8 @@ vc4_update_compiled_fs(struct vc4_context *vc4, uint8_t prim_mode) key->sample_alpha_to_one = vc4->blend->alpha_to_one; } - if (vc4->framebuffer.cbufs[0]) - key->color_format = vc4->framebuffer.cbufs[0]->format; + if (vc4->framebuffer.cbufs[0].texture) + key->color_format = vc4->framebuffer.cbufs[0].format; key->stencil_enabled = vc4->zsa->stencil_uniforms[0] != 0; key->stencil_twoside = vc4->zsa->stencil_uniforms[1] != 0; diff --git a/src/gallium/drivers/vc4/vc4_state.c b/src/gallium/drivers/vc4/vc4_state.c index 62c9ae7f3fb..4794316c25a 100644 --- a/src/gallium/drivers/vc4/vc4_state.c +++ b/src/gallium/drivers/vc4/vc4_state.c @@ -416,6 +416,7 @@ vc4_set_framebuffer_state(struct pipe_context *pctx, vc4->job = NULL; + util_framebuffer_init(pctx, framebuffer, vc4->fb_cbufs, &vc4->fb_zsbuf); util_copy_framebuffer_state(cso, framebuffer); /* Nonzero texture mipmap levels are laid out as if they were in @@ -424,17 +425,17 @@ vc4_set_framebuffer_state(struct pipe_context *pctx, * framebuffer. Note that if the z/color buffers were mismatched * sizes, we wouldn't be able to do this. */ - if (cso->cbufs[0] && cso->cbufs[0]->u.tex.level) { + if (cso->cbufs[0].texture && cso->cbufs[0].u.tex.level) { struct vc4_resource *rsc = - vc4_resource(cso->cbufs[0]->texture); + vc4_resource(cso->cbufs[0].texture); cso->width = - (rsc->slices[cso->cbufs[0]->u.tex.level].stride / + (rsc->slices[cso->cbufs[0].u.tex.level].stride / rsc->cpp); - } else if (cso->zsbuf && cso->zsbuf->u.tex.level){ + } else if (cso->zsbuf.texture && cso->zsbuf.u.tex.level){ struct vc4_resource *rsc = - vc4_resource(cso->zsbuf->texture); + vc4_resource(cso->zsbuf.texture); cso->width = - (rsc->slices[cso->zsbuf->u.tex.level].stride / + (rsc->slices[cso->zsbuf.u.tex.level].stride / rsc->cpp); } diff --git a/src/gallium/drivers/vc4/vc4_uniforms.c b/src/gallium/drivers/vc4/vc4_uniforms.c index c22adcbdd25..b1da100ea54 100644 --- a/src/gallium/drivers/vc4/vc4_uniforms.c +++ b/src/gallium/drivers/vc4/vc4_uniforms.c @@ -310,7 +310,7 @@ vc4_write_uniforms(struct vc4_context *vc4, struct vc4_compiled_shader *shader, case QUNIFORM_BLEND_CONST_COLOR_RGBA: { const uint8_t *format_swiz = - vc4_get_format_swizzle(vc4->framebuffer.cbufs[0]->format); + vc4_get_format_swizzle(vc4->framebuffer.cbufs[0].format); uint32_t color = 0; for (int i = 0; i < 4; i++) { if (format_swiz[i] >= 4) diff --git a/src/gallium/drivers/virgl/virgl_context.c b/src/gallium/drivers/virgl/virgl_context.c index 7dcec305a53..150901ac6e0 100644 --- a/src/gallium/drivers/virgl/virgl_context.c +++ b/src/gallium/drivers/virgl/virgl_context.c @@ -175,24 +175,20 @@ static void virgl_attach_res_framebuffer(struct virgl_context *vctx) struct virgl_resource *res; unsigned i; - surf = vctx->framebuffer.zsbuf; - if (surf) { + surf = &vctx->framebuffer.zsbuf; + res = virgl_resource(surf->texture); + if (res) { + vws->emit_res(vws, vctx->cbuf, res->hw_res, false); + virgl_resource_dirty(res, surf->u.tex.level); + } + for (i = 0; i < vctx->framebuffer.nr_cbufs; i++) { + surf = &vctx->framebuffer.cbufs[i]; res = virgl_resource(surf->texture); if (res) { vws->emit_res(vws, vctx->cbuf, res->hw_res, false); virgl_resource_dirty(res, surf->u.tex.level); } } - for (i = 0; i < vctx->framebuffer.nr_cbufs; i++) { - surf = vctx->framebuffer.cbufs[i]; - if (surf) { - res = virgl_resource(surf->texture); - if (res) { - vws->emit_res(vws, vctx->cbuf, res->hw_res, false); - virgl_resource_dirty(res, surf->u.tex.level); - } - } - } } static void virgl_attach_res_sampler_views(struct virgl_context *vctx, @@ -494,7 +490,8 @@ static void virgl_set_framebuffer_state(struct pipe_context *ctx, { struct virgl_context *vctx = virgl_context(ctx); - vctx->framebuffer = *state; + util_framebuffer_init(ctx, state, vctx->fb_cbufs, &vctx->fb_zsbuf); + util_copy_framebuffer_state(&vctx->framebuffer, state); virgl_encoder_set_framebuffer_state(vctx, state); virgl_attach_res_framebuffer(vctx); } @@ -1577,8 +1574,8 @@ virgl_context_destroy( struct pipe_context *ctx ) struct virgl_screen *rs = virgl_screen(ctx->screen); enum pipe_shader_type shader_type; - vctx->framebuffer.zsbuf = NULL; - vctx->framebuffer.nr_cbufs = 0; + util_framebuffer_init(ctx, NULL, vctx->fb_cbufs, &vctx->fb_zsbuf); + util_unreference_framebuffer_state(&vctx->framebuffer); virgl_encoder_destroy_sub_ctx(vctx, vctx->hw_sub_ctx_id); virgl_flush_eq(vctx, vctx, NULL); diff --git a/src/gallium/drivers/virgl/virgl_context.h b/src/gallium/drivers/virgl/virgl_context.h index 3ccc9c29eee..45465d01fca 100644 --- a/src/gallium/drivers/virgl/virgl_context.h +++ b/src/gallium/drivers/virgl/virgl_context.h @@ -27,6 +27,7 @@ #include "pipe/p_context.h" #include "util/slab.h" #include "util/list.h" +#include "util/u_framebuffer.h" #include "virgl_staging_mgr.h" #include "virgl_transfer_queue.h" @@ -76,6 +77,7 @@ struct virgl_context { struct virgl_vertex_elements_state *vertex_elements; + PIPE_FB_SURFACES; //STOP USING THIS struct pipe_framebuffer_state framebuffer; struct slab_child_pool transfer_pool; diff --git a/src/gallium/drivers/virgl/virgl_encode.c b/src/gallium/drivers/virgl/virgl_encode.c index 09b4a5e26dc..2fccc033d2e 100644 --- a/src/gallium/drivers/virgl/virgl_encode.c +++ b/src/gallium/drivers/virgl/virgl_encode.c @@ -867,14 +867,14 @@ int virgl_encode_clear_texture(struct virgl_context *ctx, int virgl_encoder_set_framebuffer_state(struct virgl_context *ctx, const struct pipe_framebuffer_state *state) { - struct virgl_surface *zsurf = virgl_surface(state->zsbuf); + struct virgl_surface *zsurf = virgl_surface(ctx->fb_zsbuf); int i; virgl_encoder_write_cmd_dword(ctx, VIRGL_CMD0(VIRGL_CCMD_SET_FRAMEBUFFER_STATE, 0, VIRGL_SET_FRAMEBUFFER_STATE_SIZE(state->nr_cbufs))); virgl_encoder_write_dword(ctx->cbuf, state->nr_cbufs); virgl_encoder_write_dword(ctx->cbuf, zsurf ? zsurf->handle : 0); for (i = 0; i < state->nr_cbufs; i++) { - struct virgl_surface *surf = virgl_surface(state->cbufs[i]); + struct virgl_surface *surf = virgl_surface(ctx->fb_cbufs[i]); virgl_encoder_write_dword(ctx->cbuf, surf ? surf->handle : 0); } diff --git a/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt b/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt index 4c0f6480ea7..6ff5558fb15 100644 --- a/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt +++ b/src/gallium/drivers/zink/ci/zink-radv-vangogh-fails.txt @@ -394,3 +394,6 @@ spec@arb_sample_locations@test@MSAA: 8- X: 3- Y: 5- Grid: false,Fail spec@arb_sample_locations@test@MSAA: 8- X: 3- Y: 5- Grid: true,Fail spec@arb_sample_locations@test@MSAA: 8- X: 3- Y: 6- Grid: false,Fail spec@arb_sample_locations@test@MSAA: 8- X: 3- Y: 6- Grid: true,Fail + +# undebuggable corner case from !34054 +spec@ext_image_dma_buf_import@ext_image_dma_buf_import-modifiers,Crash diff --git a/src/gallium/drivers/zink/zink_blit.c b/src/gallium/drivers/zink/zink_blit.c index 2604ab8a714..8cddbe739a3 100644 --- a/src/gallium/drivers/zink/zink_blit.c +++ b/src/gallium/drivers/zink/zink_blit.c @@ -424,7 +424,7 @@ zink_blit(struct pipe_context *pctx, bool in_rp = ctx->in_rp; uint64_t tc_data = ctx->dynamic_fb.tc_info.data; bool queries_disabled = ctx->queries_disabled; - bool rp_changed = ctx->rp_changed || (!ctx->fb_state.zsbuf && util_format_is_depth_or_stencil(info->dst.format)); + bool rp_changed = ctx->rp_changed || (!ctx->fb_state.zsbuf.texture && util_format_is_depth_or_stencil(info->dst.format)); unsigned ds3_states = ctx->ds3_states; bool rp_tc_info_updated = ctx->rp_tc_info_updated; if (ctx->unordered_blitting) { diff --git a/src/gallium/drivers/zink/zink_clear.c b/src/gallium/drivers/zink/zink_clear.c index 393662b8dd1..aa6585b0a2b 100644 --- a/src/gallium/drivers/zink/zink_clear.c +++ b/src/gallium/drivers/zink/zink_clear.c @@ -65,7 +65,7 @@ clear_in_rp(struct pipe_context *pctx, color.uint32[3] = pcolor->ui[3]; for (unsigned i = 0; i < fb->nr_cbufs; i++) { - if (!(buffers & (PIPE_CLEAR_COLOR0 << i)) || !fb->cbufs[i]) + if (!(buffers & (PIPE_CLEAR_COLOR0 << i)) || !fb->cbufs[i].texture) continue; attachments[num_attachments].aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; @@ -75,7 +75,7 @@ clear_in_rp(struct pipe_context *pctx, } } - if (buffers & PIPE_CLEAR_DEPTHSTENCIL && fb->zsbuf) { + if (buffers & PIPE_CLEAR_DEPTHSTENCIL && fb->zsbuf.texture) { VkImageAspectFlags aspect = 0; if (buffers & PIPE_CLEAR_DEPTH) aspect |= VK_IMAGE_ASPECT_DEPTH_BIT; @@ -180,23 +180,23 @@ zink_clear(struct pipe_context *pctx, } unsigned clear_buffers = buffers >> 2; for (unsigned i = 0; i < ctx->fb_state.nr_cbufs; i++) { - if (ctx->fb_state.cbufs[i] && + if (ctx->fb_state.cbufs[i].texture && (ctx->fb_layer_mismatch & clear_buffers & BITFIELD_BIT(i))) { if (ctx->void_clears & (PIPE_CLEAR_COLOR0 << i)) { union pipe_color_union color; color.f[0] = color.f[1] = color.f[2] = 0; color.f[3] = 1.0; - pctx->clear_render_target(pctx, ctx->fb_state.cbufs[i], &color, + pctx->clear_render_target(pctx, &ctx->fb_state.cbufs[i], &color, 0, 0, ctx->fb_state.width, ctx->fb_state.height, ctx->render_condition_active); } - pctx->clear_render_target(pctx, ctx->fb_state.cbufs[i], pcolor, + pctx->clear_render_target(pctx, &ctx->fb_state.cbufs[i], pcolor, x, y, w, h, ctx->render_condition_active); } } - if (ctx->fb_state.zsbuf && (buffers & PIPE_CLEAR_DEPTHSTENCIL)) - pctx->clear_depth_stencil(pctx, ctx->fb_state.zsbuf, buffers & PIPE_CLEAR_DEPTHSTENCIL, depth, stencil, + if (ctx->fb_state.zsbuf.texture && (buffers & PIPE_CLEAR_DEPTHSTENCIL)) + pctx->clear_depth_stencil(pctx, &ctx->fb_state.zsbuf, buffers & PIPE_CLEAR_DEPTHSTENCIL, depth, stencil, x, y, w, h, ctx->render_condition_active); } @@ -220,7 +220,7 @@ zink_clear(struct pipe_context *pctx, color.f[0] = color.f[1] = color.f[2] = 0; color.f[3] = 1.0; for (unsigned i = 0; i < fb->nr_cbufs; i++) { - if ((void_clears & (PIPE_CLEAR_COLOR0 << i)) && fb->cbufs[i]) { + if ((void_clears & (PIPE_CLEAR_COLOR0 << i)) && fb->cbufs[i].texture) { struct zink_framebuffer_clear *fb_clear = &ctx->fb_clears[i]; unsigned num_clears = zink_fb_clear_count(fb_clear); if (num_clears) { @@ -247,8 +247,8 @@ zink_clear(struct pipe_context *pctx, if (buffers & PIPE_CLEAR_COLOR) { for (unsigned i = 0; i < fb->nr_cbufs; i++) { - if ((buffers & (PIPE_CLEAR_COLOR0 << i)) && fb->cbufs[i]) { - struct pipe_surface *psurf = fb->cbufs[i]; + if ((buffers & (PIPE_CLEAR_COLOR0 << i)) && fb->cbufs[i].texture) { + struct pipe_surface *psurf = &fb->cbufs[i]; struct zink_framebuffer_clear *fb_clear = &ctx->fb_clears[i]; struct zink_framebuffer_clear_data *clear = get_clear_data(ctx, fb_clear, needs_rp ? scissor_state : NULL); @@ -267,7 +267,7 @@ zink_clear(struct pipe_context *pctx, } } - if (buffers & PIPE_CLEAR_DEPTHSTENCIL && fb->zsbuf) { + if (buffers & PIPE_CLEAR_DEPTHSTENCIL && fb->zsbuf.texture) { struct zink_framebuffer_clear *fb_clear = &ctx->fb_clears[PIPE_MAX_COLOR_BUFS]; struct zink_framebuffer_clear_data *clear = get_clear_data(ctx, fb_clear, needs_rp ? scissor_state : NULL); ctx->clears_enabled |= PIPE_CLEAR_DEPTHSTENCIL; @@ -401,7 +401,7 @@ out: zink_fb_clear_reset(ctx, i); } -static struct pipe_surface * +static struct pipe_surface create_clear_surface(struct pipe_context *pctx, struct pipe_resource *pres, unsigned level, const struct pipe_box *box) { struct pipe_surface tmpl = {{0}}; @@ -410,7 +410,7 @@ create_clear_surface(struct pipe_context *pctx, struct pipe_resource *pres, unsi tmpl.u.tex.first_layer = box->z; tmpl.u.tex.last_layer = box->z + box->depth - 1; tmpl.u.tex.level = level; - return pctx->create_surface(pctx, pres, &tmpl); + return tmpl; } static void @@ -425,8 +425,10 @@ set_clear_fb(struct pipe_context *pctx, struct pipe_surface *psurf, struct pipe_ fb_state.width = width; fb_state.height = height; fb_state.nr_cbufs = !!psurf; - fb_state.cbufs[0] = psurf; - fb_state.zsbuf = zsurf; + if (psurf) + fb_state.cbufs[0] = *psurf; + if (zsurf) + fb_state.zsbuf = *zsurf; pctx->set_framebuffer_state(pctx, &fb_state); } @@ -445,7 +447,8 @@ zink_clear_texture_dynamic(struct pipe_context *pctx, 0 <= box->y && u_minify(pres->height0, level) >= box->y + box->height && 0 <= box->z && u_minify(pres->target == PIPE_TEXTURE_3D ? pres->depth0 : pres->array_size, level) >= box->z + box->depth; - struct pipe_surface *surf = create_clear_surface(pctx, pres, level, box); + struct pipe_surface psurf = create_clear_surface(pctx, pres, level, box); + struct pipe_surface *surf = pctx->create_surface(pctx, pres, &psurf); VkRenderingAttachmentInfo att = {0}; att.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO; @@ -509,8 +512,7 @@ zink_clear_texture_dynamic(struct pipe_context *pctx, } VKCTX(CmdEndRendering)(cmdbuf); zink_batch_reference_resource_rw(ctx, res, true); - /* this will never destroy the surface */ - pipe_surface_reference(&surf, NULL); + pctx->surface_destroy(pctx, surf); } void @@ -522,7 +524,7 @@ zink_clear_texture(struct pipe_context *pctx, { struct zink_context *ctx = zink_context(pctx); struct zink_resource *res = zink_resource(pres); - struct pipe_surface *surf = NULL; + struct pipe_surface surf = create_clear_surface(pctx, pres, level, box); struct pipe_scissor_state scissor = {box->x, box->y, box->x + box->width, box->y + box->height}; if (res->aspect & VK_IMAGE_ASPECT_COLOR_BIT) { @@ -530,9 +532,8 @@ zink_clear_texture(struct pipe_context *pctx, util_format_unpack_rgba(pres->format, color.ui, data, 1); - surf = create_clear_surface(pctx, pres, level, box); util_blitter_save_framebuffer(ctx->blitter, &ctx->fb_state); - set_clear_fb(pctx, surf, NULL); + set_clear_fb(pctx, &surf, NULL); zink_blit_barriers(ctx, NULL, res, false); ctx->blitting = true; ctx->queries_disabled = true; @@ -555,19 +556,16 @@ zink_clear_texture(struct pipe_context *pctx, flags |= PIPE_CLEAR_DEPTH; if (res->aspect & VK_IMAGE_ASPECT_STENCIL_BIT) flags |= PIPE_CLEAR_STENCIL; - surf = create_clear_surface(pctx, pres, level, box); util_blitter_save_framebuffer(ctx->blitter, &ctx->fb_state); zink_blit_barriers(ctx, NULL, res, false); ctx->blitting = true; - set_clear_fb(pctx, NULL, surf); + set_clear_fb(pctx, NULL, &surf); ctx->queries_disabled = true; pctx->clear(pctx, flags, &scissor, NULL, depth, stencil); util_blitter_restore_fb_state(ctx->blitter); ctx->queries_disabled = false; ctx->blitting = false; } - /* this will never destroy the surface */ - pipe_surface_reference(&surf, NULL); } void @@ -621,6 +619,7 @@ zink_clear_render_target(struct pipe_context *pctx, struct pipe_surface *dst, bool render_condition_enabled) { struct zink_context *ctx = zink_context(pctx); + struct pipe_resource *pres = dst->texture; bool render_condition_active = ctx->render_condition_active; if (!render_condition_enabled && render_condition_active) { zink_stop_conditional_render(ctx); @@ -629,7 +628,7 @@ zink_clear_render_target(struct pipe_context *pctx, struct pipe_surface *dst, util_blitter_save_framebuffer(ctx->blitter, &ctx->fb_state); set_clear_fb(pctx, dst, NULL); struct pipe_scissor_state scissor = {dstx, dsty, dstx + width, dsty + height}; - zink_blit_barriers(ctx, NULL, zink_resource(dst->texture), false); + zink_blit_barriers(ctx, NULL, zink_resource(pres), false); ctx->blitting = true; pctx->clear(pctx, PIPE_CLEAR_COLOR0, &scissor, color, 0, 0); util_blitter_restore_fb_state(ctx->blitter); @@ -646,6 +645,7 @@ zink_clear_depth_stencil(struct pipe_context *pctx, struct pipe_surface *dst, bool render_condition_enabled) { struct zink_context *ctx = zink_context(pctx); + struct pipe_resource *pres = dst->texture; /* check for stencil fallback */ bool blitting = ctx->blitting; bool render_condition_active = ctx->render_condition_active; @@ -653,7 +653,7 @@ zink_clear_depth_stencil(struct pipe_context *pctx, struct pipe_surface *dst, zink_stop_conditional_render(ctx); ctx->render_condition_active = false; } - bool cur_attachment = zink_csurface(ctx->fb_state.zsbuf) == zink_csurface(dst); + bool cur_attachment = zink_csurface(ctx->fb_zsbuf) == zink_csurface(dst); if (dstx > ctx->fb_state.width || dsty > ctx->fb_state.height || dstx + width > ctx->fb_state.width || dsty + height > ctx->fb_state.height) @@ -662,7 +662,7 @@ zink_clear_depth_stencil(struct pipe_context *pctx, struct pipe_surface *dst, if (!blitting) { util_blitter_save_framebuffer(ctx->blitter, &ctx->fb_state); set_clear_fb(pctx, NULL, dst); - zink_blit_barriers(ctx, NULL, zink_resource(dst->texture), false); + zink_blit_barriers(ctx, NULL, zink_resource(pres), false); ctx->blitting = true; } } @@ -762,12 +762,12 @@ zink_fb_clears_apply(struct zink_context *ctx, struct pipe_resource *pres, int z { if (zink_resource(pres)->aspect == VK_IMAGE_ASPECT_COLOR_BIT) { for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { - if (ctx->fb_state.cbufs[i] && ctx->fb_state.cbufs[i]->texture == pres && fb_depth_intersects(ctx->fb_state.cbufs[i], z, depth)) { + if (ctx->fb_state.cbufs[i].texture == pres && fb_depth_intersects(&ctx->fb_state.cbufs[i], z, depth)) { fb_clears_apply_internal(ctx, pres, i); } } } else { - if (ctx->fb_state.zsbuf && ctx->fb_state.zsbuf->texture == pres && fb_depth_intersects(ctx->fb_state.zsbuf, z, depth)) { + if (ctx->fb_state.zsbuf.texture == pres && fb_depth_intersects(&ctx->fb_state.zsbuf, z, depth)) { fb_clears_apply_internal(ctx, pres, PIPE_MAX_COLOR_BUFS); } } @@ -778,14 +778,14 @@ zink_fb_clears_discard(struct zink_context *ctx, struct pipe_resource *pres) { if (zink_resource(pres)->aspect == VK_IMAGE_ASPECT_COLOR_BIT) { for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { - if (ctx->fb_state.cbufs[i] && ctx->fb_state.cbufs[i]->texture == pres) { + if (ctx->fb_state.cbufs[i].texture == pres) { if (zink_fb_clear_enabled(ctx, i)) { zink_fb_clear_reset(ctx, i); } } } } else { - if (zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS) && ctx->fb_state.zsbuf && ctx->fb_state.zsbuf->texture == pres) { + if (zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS) && ctx->fb_state.zsbuf.texture == pres) { int i = PIPE_MAX_COLOR_BUFS; zink_fb_clear_reset(ctx, i); } @@ -804,9 +804,9 @@ zink_clear_apply_conditionals(struct zink_context *ctx) if (clear->conditional) { struct pipe_surface *surf; if (i < PIPE_MAX_COLOR_BUFS) - surf = ctx->fb_state.cbufs[i]; + surf = &ctx->fb_state.cbufs[i]; else - surf = ctx->fb_state.zsbuf; + surf = &ctx->fb_state.zsbuf; if (surf) fb_clears_apply_internal(ctx, surf->texture, i); else @@ -858,15 +858,15 @@ zink_fb_clears_apply_or_discard(struct zink_context *ctx, struct pipe_resource * { if (zink_resource(pres)->aspect == VK_IMAGE_ASPECT_COLOR_BIT) { for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { - if (ctx->fb_state.cbufs[i] && ctx->fb_state.cbufs[i]->texture == pres && - fb_depth_intersects(ctx->fb_state.cbufs[i], z, depth)) { - fb_clears_apply_or_discard_internal(ctx, pres, region, discard_only, false, fb_depth_fills(ctx->fb_state.cbufs[i], z, depth), i); + if (ctx->fb_state.cbufs[i].texture == pres && + fb_depth_intersects(&ctx->fb_state.cbufs[i], z, depth)) { + fb_clears_apply_or_discard_internal(ctx, pres, region, discard_only, false, fb_depth_fills(&ctx->fb_state.cbufs[i], z, depth), i); } } } else { - if (zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS) && ctx->fb_state.zsbuf && ctx->fb_state.zsbuf->texture == pres && - fb_depth_intersects(ctx->fb_state.zsbuf, z, depth)) { - fb_clears_apply_or_discard_internal(ctx, pres, region, discard_only, false, fb_depth_fills(ctx->fb_state.zsbuf, z, depth), PIPE_MAX_COLOR_BUFS); + if (zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS) && ctx->fb_state.zsbuf.texture == pres && + fb_depth_intersects(&ctx->fb_state.zsbuf, z, depth)) { + fb_clears_apply_or_discard_internal(ctx, pres, region, discard_only, false, fb_depth_fills(&ctx->fb_state.zsbuf, z, depth), PIPE_MAX_COLOR_BUFS); } } } @@ -876,13 +876,13 @@ zink_fb_clears_apply_region(struct zink_context *ctx, struct pipe_resource *pres { if (zink_resource(pres)->aspect == VK_IMAGE_ASPECT_COLOR_BIT) { for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { - if (ctx->fb_state.cbufs[i] && ctx->fb_state.cbufs[i]->texture == pres && fb_depth_intersects(ctx->fb_state.cbufs[i], z, depth)) { - fb_clears_apply_or_discard_internal(ctx, pres, region, false, true, fb_depth_fills(ctx->fb_state.cbufs[i], z, depth), i); + if (ctx->fb_state.cbufs[i].texture == pres && fb_depth_intersects(&ctx->fb_state.cbufs[i], z, depth)) { + fb_clears_apply_or_discard_internal(ctx, pres, region, false, true, fb_depth_fills(&ctx->fb_state.cbufs[i], z, depth), i); } } } else { - if (ctx->fb_state.zsbuf && ctx->fb_state.zsbuf->texture == pres && fb_depth_intersects(ctx->fb_state.zsbuf, z, depth)) { - fb_clears_apply_or_discard_internal(ctx, pres, region, false, true, fb_depth_fills(ctx->fb_state.zsbuf, z, depth), PIPE_MAX_COLOR_BUFS); + if (ctx->fb_state.zsbuf.texture == pres && fb_depth_intersects(&ctx->fb_state.zsbuf, z, depth)) { + fb_clears_apply_or_discard_internal(ctx, pres, region, false, true, fb_depth_fills(&ctx->fb_state.zsbuf, z, depth), PIPE_MAX_COLOR_BUFS); } } } diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 51e28fb5750..5e618c06ec3 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -145,9 +145,8 @@ zink_context_destroy(struct pipe_context *pctx) if (ctx->blitter) util_blitter_destroy(ctx->blitter); - for (unsigned i = 0; i < ctx->fb_state.nr_cbufs; i++) - pipe_surface_unref(&ctx->base, &ctx->fb_state.cbufs[i]); - pipe_surface_unref(&ctx->base, &ctx->fb_state.zsbuf); + util_unreference_framebuffer_state(&ctx->fb_state); + util_framebuffer_init(pctx, NULL, ctx->fb_cbufs, &ctx->fb_zsbuf); pipe_resource_reference(&ctx->dummy_vertex_buffer, NULL); pipe_resource_reference(&ctx->dummy_xfb_buffer, NULL); @@ -2828,15 +2827,15 @@ zink_update_fbfetch(struct zink_context *ctx) } bool changed = !had_fbfetch; - if (ctx->fb_state.cbufs[0]) { - VkImageView fbfetch = zink_csurface(ctx->fb_state.cbufs[0])->image_view; + if (ctx->fb_state.cbufs[0].texture) { + VkImageView fbfetch = zink_csurface(ctx->fb_cbufs[0])->image_view; if (!fbfetch) /* swapchain image: retry later */ return false; changed |= fbfetch != ctx->di.fbfetch.imageView; - ctx->di.fbfetch.imageView = zink_csurface(ctx->fb_state.cbufs[0])->image_view; + ctx->di.fbfetch.imageView = zink_csurface(ctx->fb_cbufs[0])->image_view; - bool fbfetch_ms = ctx->fb_state.cbufs[0]->texture->nr_samples > 1; + bool fbfetch_ms = ctx->fb_state.cbufs[0].texture->nr_samples > 1; if (zink_get_fs_base_key(ctx)->fbfetch_ms != fbfetch_ms) zink_set_fs_base_key(ctx)->fbfetch_ms = fbfetch_ms; } else { @@ -2902,16 +2901,16 @@ unsigned zink_update_rendering_info(struct zink_context *ctx) { for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { - struct zink_surface *surf = zink_csurface(ctx->fb_state.cbufs[i]); + struct zink_surface *surf = zink_csurface(ctx->fb_cbufs[i]); ctx->gfx_pipeline_state.rendering_formats[i] = surf ? surf->info.format[0] : VK_FORMAT_UNDEFINED; } ctx->gfx_pipeline_state.rendering_info.viewMask = ctx->fb_state.viewmask; ctx->gfx_pipeline_state.rendering_info.depthAttachmentFormat = VK_FORMAT_UNDEFINED; ctx->gfx_pipeline_state.rendering_info.stencilAttachmentFormat = VK_FORMAT_UNDEFINED; - if (ctx->fb_state.zsbuf && zink_is_zsbuf_used(ctx)) { - struct zink_surface *surf = zink_csurface(ctx->fb_state.zsbuf); - bool has_depth = util_format_has_depth(util_format_description(ctx->fb_state.zsbuf->format)); - bool has_stencil = util_format_has_stencil(util_format_description(ctx->fb_state.zsbuf->format)); + if (ctx->fb_state.zsbuf.texture && zink_is_zsbuf_used(ctx)) { + struct zink_surface *surf = zink_csurface(ctx->fb_zsbuf); + bool has_depth = util_format_has_depth(util_format_description(ctx->fb_state.zsbuf.format)); + bool has_stencil = util_format_has_stencil(util_format_description(ctx->fb_state.zsbuf.format)); if (has_depth) ctx->gfx_pipeline_state.rendering_info.depthAttachmentFormat = surf->info.format[0]; @@ -2949,7 +2948,7 @@ begin_rendering(struct zink_context *ctx, bool check_msaa_expand) if (ctx->rp_changed || ctx->rp_layout_changed || (!ctx->in_rp && ctx->rp_loadop_changed)) { /* init imageviews, base loadOp, formats */ for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { - struct zink_surface *surf = zink_csurface(ctx->fb_state.cbufs[i]); + struct zink_surface *surf = zink_csurface(ctx->fb_cbufs[i]); if (!surf) continue; @@ -2974,10 +2973,10 @@ begin_rendering(struct zink_context *ctx, bool check_msaa_expand) ctx->dynamic_fb.info.pDepthAttachment = NULL; ctx->dynamic_fb.info.pStencilAttachment = NULL; - if (ctx->fb_state.zsbuf && zsbuf_used) { - struct zink_surface *surf = zink_csurface(ctx->fb_state.zsbuf); - has_depth = util_format_has_depth(util_format_description(ctx->fb_state.zsbuf->format)); - has_stencil = util_format_has_stencil(util_format_description(ctx->fb_state.zsbuf->format)); + if (ctx->fb_state.zsbuf.texture && zsbuf_used) { + struct zink_surface *surf = zink_csurface(ctx->fb_zsbuf); + has_depth = util_format_has_depth(util_format_description(ctx->fb_state.zsbuf.format)); + has_stencil = util_format_has_stencil(util_format_description(ctx->fb_state.zsbuf.format)); /* depth may or may not be used but init it anyway */ if (zink_resource(surf->base.texture)->valid) @@ -3019,7 +3018,7 @@ begin_rendering(struct zink_context *ctx, bool check_msaa_expand) /* similar to begin_render_pass(), but just filling in VkRenderingInfo */ for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { /* these are no-ops */ - if (!ctx->fb_state.cbufs[i] || !zink_fb_clear_enabled(ctx, i)) + if (!ctx->fb_state.cbufs[i].texture || !zink_fb_clear_enabled(ctx, i)) continue; /* these need actual clear calls inside the rp */ struct zink_framebuffer_clear_data *clear = zink_fb_clear_element(&ctx->fb_clears[i], 0); @@ -3033,7 +3032,7 @@ begin_rendering(struct zink_context *ctx, bool check_msaa_expand) memcpy(&ctx->dynamic_fb.attachments[i].clearValue, &clear->color, sizeof(float) * 4); ctx->dynamic_fb.attachments[i].loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; } - if (ctx->fb_state.zsbuf && zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS)) { + if (ctx->fb_state.zsbuf.texture && zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS)) { struct zink_framebuffer_clear *fb_clear = &ctx->fb_clears[PIPE_MAX_COLOR_BUFS]; struct zink_framebuffer_clear_data *clear = zink_fb_clear_element(fb_clear, 0); if (!zink_fb_clear_element_needs_explicit(clear)) { @@ -3069,13 +3068,13 @@ begin_rendering(struct zink_context *ctx, bool check_msaa_expand) if (ctx->clears_enabled) { for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { /* these are no-ops */ - if (!ctx->fb_state.cbufs[i] || !zink_fb_clear_enabled(ctx, i)) + if (!ctx->fb_state.cbufs[i].texture || !zink_fb_clear_enabled(ctx, i)) continue; /* these need actual clear calls inside the rp */ if (zink_fb_clear_needs_explicit(&ctx->fb_clears[i])) clear_buffers |= (PIPE_CLEAR_COLOR0 << i); } - if (ctx->fb_state.zsbuf && zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS)) { + if (ctx->fb_state.zsbuf.texture && zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS)) { struct zink_framebuffer_clear *fb_clear = &ctx->fb_clears[PIPE_MAX_COLOR_BUFS]; struct zink_framebuffer_clear_data *clear = zink_fb_clear_element(fb_clear, 0); if (zink_fb_clear_needs_explicit(fb_clear)) { @@ -3103,9 +3102,9 @@ begin_rendering(struct zink_context *ctx, bool check_msaa_expand) zink_batch_no_rp(ctx); for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { VkImageView iv = VK_NULL_HANDLE; - struct zink_surface *surf = zink_csurface(ctx->fb_state.cbufs[i]); + struct zink_surface *surf = zink_csurface(ctx->fb_cbufs[i]); if (surf) { - struct zink_surface *transient = zink_transient_surface(ctx->fb_state.cbufs[i]); + struct zink_surface *transient = zink_transient_surface(ctx->fb_cbufs[i]); if (transient && !has_msrtss) { iv = zink_prep_fb_attachment(ctx, transient, i); ctx->dynamic_fb.attachments[i].imageLayout = zink_resource(transient->base.texture)->layout; @@ -3145,7 +3144,7 @@ begin_rendering(struct zink_context *ctx, bool check_msaa_expand) ctx->dynamic_fb.attachments[0].resolveImageView = surf->image_view; } if (has_swapchain) { - ASSERTED struct zink_resource *res = zink_resource(ctx->fb_state.cbufs[0]->texture); + ASSERTED struct zink_resource *res = zink_resource(ctx->fb_state.cbufs[0].texture); zink_render_fixup_swapchain(ctx); if (res->use_damage) { ctx->dynamic_fb.info.renderArea = res->damage; @@ -3161,9 +3160,9 @@ begin_rendering(struct zink_context *ctx, bool check_msaa_expand) if (res->base.b.height0 < ctx->dynamic_fb.info.renderArea.extent.height) ctx->dynamic_fb.info.renderArea.extent.height = res->base.b.height0; } - if (ctx->fb_state.zsbuf && zsbuf_used) { - struct zink_surface *surf = zink_csurface(ctx->fb_state.zsbuf); - struct zink_surface *transient = zink_transient_surface(ctx->fb_state.zsbuf); + if (ctx->fb_state.zsbuf.texture && zsbuf_used) { + struct zink_surface *surf = zink_csurface(ctx->fb_zsbuf); + struct zink_surface *transient = zink_transient_surface(ctx->fb_zsbuf); VkImageView iv; if (transient && !has_msrtss) { iv = zink_prep_fb_attachment(ctx, transient, ctx->fb_state.nr_cbufs); @@ -3484,10 +3483,10 @@ zink_evaluate_depth_buffer(struct pipe_context *pctx) { struct zink_context *ctx = zink_context(pctx); - if (!ctx->fb_state.zsbuf) + if (!ctx->fb_state.zsbuf.texture) return; - struct zink_resource *res = zink_resource(ctx->fb_state.zsbuf->texture); + struct zink_resource *res = zink_resource(ctx->fb_state.zsbuf.texture); res->obj->needs_zs_evaluate = true; zink_init_vk_sample_locations(ctx, &res->obj->zs_evaluate); zink_batch_no_rp(ctx); @@ -3728,8 +3727,8 @@ rebind_fb_state(struct zink_context *ctx, struct zink_resource *match_res, bool { bool rebind = false; for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) - rebind |= rebind_fb_surface(ctx, &ctx->fb_state.cbufs[i], match_res); - rebind |= rebind_fb_surface(ctx, &ctx->fb_state.zsbuf, match_res); + rebind |= rebind_fb_surface(ctx, &ctx->fb_cbufs[i], match_res); + rebind |= rebind_fb_surface(ctx, &ctx->fb_zsbuf, match_res); return rebind; } @@ -3848,13 +3847,23 @@ check_framebuffer_surface_mutable(struct pipe_context *pctx, struct pipe_surface csurf->needs_mutable = false; } +static bool +framebuffer_surface_needs_mutable(const struct pipe_resource *pres, const struct pipe_surface *templ) +{ + const struct zink_resource *res = (const struct zink_resource*)pres; + if (!res->obj->dt && zink_format_needs_mutable(pres->format, templ->format)) + /* mutable not set by default */ + return !(res->base.b.bind & ZINK_BIND_MUTABLE); + return false; +} + static void zink_set_framebuffer_state(struct pipe_context *pctx, const struct pipe_framebuffer_state *state) { struct zink_context *ctx = zink_context(pctx); struct zink_screen *screen = zink_screen(pctx->screen); - unsigned samples = state->nr_cbufs || state->zsbuf ? 0 : state->samples; + unsigned samples = state->nr_cbufs || state->zsbuf.texture ? 0 : state->samples; unsigned w = ctx->fb_state.width; unsigned h = ctx->fb_state.height; unsigned layers = MAX2(zink_framebuffer_get_num_layers(state), 1); @@ -3864,22 +3873,21 @@ zink_set_framebuffer_state(struct pipe_context *pctx, state->width != w || state->height != h); if (ctx->clears_enabled && !flush_clears) { for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { - if (i >= state->nr_cbufs || !ctx->fb_state.cbufs[i] || !state->cbufs[i]) + if (i >= state->nr_cbufs || !ctx->fb_state.cbufs[i].texture || !state->cbufs[i].texture) flush_clears |= zink_fb_clear_enabled(ctx, i); - else if (zink_fb_clear_enabled(ctx, i) && ctx->fb_state.cbufs[i] != state->cbufs[i]) { - struct zink_surface *a = zink_csurface(ctx->fb_state.cbufs[i]); - struct zink_surface *b = zink_csurface(state->cbufs[i]); - if (a == b) - continue; - if (!a || !b || memcmp(&a->base.u.tex, &b->base.u.tex, sizeof(b->base.u.tex)) || - a->base.texture != b->base.texture) + else if (zink_fb_clear_enabled(ctx, i) && !pipe_surface_equal(&ctx->fb_state.cbufs[i], &state->cbufs[i])) { + struct zink_surface *a = zink_csurface(ctx->fb_cbufs[i]); + const struct pipe_surface *b = &state->cbufs[i]; + if (!a || !b->texture || framebuffer_surface_needs_mutable(b->texture, b) || memcmp(&a->base.u.tex, &b->u.tex, sizeof(b->u.tex)) || + a->base.texture != b->texture) flush_clears = true; - else if (a->base.format != b->base.format) - zink_fb_clear_rewrite(ctx, i, a->base.format, b->base.format); + else if (ctx->fb_state.cbufs[i].format != state->cbufs[i].format) + zink_fb_clear_rewrite(ctx, i, ctx->fb_state.cbufs[i].format, state->cbufs[i].format); } } } - if (ctx->fb_state.zsbuf != state->zsbuf) + bool zsbuf_changed = !pipe_surface_equal(&ctx->fb_state.zsbuf, &state->zsbuf); + if (zsbuf_changed) flush_clears |= zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS); if (flush_clears) { bool queries_disabled = ctx->queries_disabled; @@ -3890,20 +3898,20 @@ zink_set_framebuffer_state(struct pipe_context *pctx, /* need to ensure we start a new rp on next draw */ zink_batch_no_rp_safe(ctx); for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { - struct pipe_surface *psurf = ctx->fb_state.cbufs[i]; - if (i < state->nr_cbufs) - ctx->rp_changed |= !!zink_transient_surface(psurf) != !!zink_transient_surface(state->cbufs[i]); - unbind_fb_surface(ctx, psurf, i, i >= state->nr_cbufs || psurf != state->cbufs[i]); + struct pipe_surface *psurf = ctx->fb_cbufs[i]; + if (i < state->nr_cbufs && !screen->info.have_EXT_multisampled_render_to_single_sampled) + ctx->rp_changed |= !!ctx->fb_state.cbufs[i].nr_samples != !!state->cbufs[i].nr_samples; + unbind_fb_surface(ctx, psurf, i, i >= state->nr_cbufs || !pipe_surface_equal(&ctx->fb_state.cbufs[i], &state->cbufs[i])); if (psurf && ctx->needs_present == zink_resource(psurf->texture)) zink_resource_reference(&ctx->needs_present, NULL); } - if (ctx->fb_state.zsbuf) { - struct pipe_surface *psurf = ctx->fb_state.zsbuf; + if (ctx->fb_state.zsbuf.texture) { + struct pipe_surface *psurf = ctx->fb_zsbuf; struct zink_resource *res = zink_resource(psurf->texture); - bool changed = psurf != state->zsbuf; + bool changed = zsbuf_changed; unbind_fb_surface(ctx, psurf, PIPE_MAX_COLOR_BUFS, changed); - if (!changed) - ctx->rp_changed |= !!zink_transient_surface(psurf) != !!zink_transient_surface(state->zsbuf); + if (!changed && !screen->info.have_EXT_multisampled_render_to_single_sampled) + ctx->rp_changed |= !!ctx->fb_state.zsbuf.nr_samples != !!state->zsbuf.nr_samples; if (changed && unlikely(res->obj->needs_zs_evaluate)) /* have to flush zs eval while the sample location data still exists, * so just throw some random barrier */ @@ -3912,7 +3920,7 @@ zink_set_framebuffer_state(struct pipe_context *pctx, } /* renderpass changes if the number or types of attachments change */ ctx->rp_changed |= ctx->fb_state.nr_cbufs != state->nr_cbufs; - ctx->rp_changed |= !!ctx->fb_state.zsbuf != !!state->zsbuf; + ctx->rp_changed |= !!ctx->fb_state.zsbuf.texture != !!state->zsbuf.texture; if (ctx->tc && screen->driver_workarounds.track_renderpasses) ctx->rp_changed |= ctx->fb_state.resolve != state->resolve; if (ctx->fb_state.nr_cbufs != state->nr_cbufs) { @@ -3921,6 +3929,7 @@ zink_set_framebuffer_state(struct pipe_context *pctx, ctx->ds3_states |= BITFIELD_BIT(ZINK_DS3_BLEND_ON) | BITFIELD_BIT(ZINK_DS3_BLEND_WRITE) | BITFIELD_BIT(ZINK_DS3_BLEND_EQ); } + util_framebuffer_init(pctx, state, ctx->fb_cbufs, &ctx->fb_zsbuf); util_copy_framebuffer_state(&ctx->fb_state, state); ctx->rp_changed |= zink_update_fbfetch(ctx); ctx->transient_attachments = 0; @@ -3939,7 +3948,7 @@ zink_set_framebuffer_state(struct pipe_context *pctx, ctx->void_clears = 0; for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { - struct pipe_surface *psurf = ctx->fb_state.cbufs[i]; + struct pipe_surface *psurf = ctx->fb_cbufs[i]; if (psurf) { struct zink_surface *transient = zink_transient_surface(psurf); if (transient || psurf->nr_samples) @@ -3970,8 +3979,8 @@ zink_set_framebuffer_state(struct pipe_context *pctx, } } unsigned depth_bias_scale_factor = ctx->depth_bias_scale_factor; - if (ctx->fb_state.zsbuf) { - struct pipe_surface *psurf = ctx->fb_state.zsbuf; + if (ctx->fb_state.zsbuf.texture) { + struct pipe_surface *psurf = ctx->fb_zsbuf; struct zink_surface *transient = zink_transient_surface(psurf); check_framebuffer_surface_mutable(pctx, psurf); if (transient || psurf->nr_samples) @@ -4113,12 +4122,12 @@ zink_flush(struct pipe_context *pctx, ctx->fbfetch_outputs = 0; ctx->rp_changed = true; } - if (ctx->fb_state.zsbuf) - zink_blit_barriers(ctx, NULL, zink_resource(ctx->fb_state.zsbuf->texture), false); + if (ctx->fb_state.zsbuf.texture) + zink_blit_barriers(ctx, NULL, zink_resource(ctx->fb_state.zsbuf.texture), false); for (unsigned i = 0; i < ctx->fb_state.nr_cbufs; i++) { - if (ctx->fb_state.cbufs[i]) - zink_blit_barriers(ctx, NULL, zink_resource(ctx->fb_state.cbufs[i]->texture), false); + if (ctx->fb_state.cbufs[i].texture) + zink_blit_barriers(ctx, NULL, zink_resource(ctx->fb_state.cbufs[i].texture), false); } ctx->blitting = true; /* start rp to do all the clears */ @@ -4533,15 +4542,14 @@ zink_rebind_framebuffer(struct zink_context *ctx, struct zink_resource *res) bool did_rebind = false; if (res->aspect & VK_IMAGE_ASPECT_COLOR_BIT) { for (unsigned i = 0; i < ctx->fb_state.nr_cbufs; i++) { - if (!ctx->fb_state.cbufs[i] || - zink_resource(ctx->fb_state.cbufs[i]->texture) != res) + if (zink_resource(ctx->fb_state.cbufs[i].texture) != res) continue; - zink_rebind_ctx_surface(ctx, &ctx->fb_state.cbufs[i]); + zink_rebind_ctx_surface(ctx, &ctx->fb_cbufs[i]); did_rebind = true; } } else { - if (ctx->fb_state.zsbuf && zink_resource(ctx->fb_state.zsbuf->texture) != res) { - zink_rebind_ctx_surface(ctx, &ctx->fb_state.zsbuf); + if (zink_resource(ctx->fb_state.zsbuf.texture) != res) { + zink_rebind_ctx_surface(ctx, &ctx->fb_zsbuf); did_rebind = true; } } @@ -5713,7 +5721,8 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) } ctx->gfx_pipeline_state.sample_mask = BITFIELD_MASK(32); struct pipe_framebuffer_state fb = {0}; - fb.cbufs[0] = zink_get_dummy_pipe_surface(ctx, 0); + struct pipe_surface *psurf = zink_get_dummy_pipe_surface(ctx, 0); + fb.cbufs[0] = *psurf; fb.nr_cbufs = 1; fb.width = fb.height = 256; ctx->base.set_framebuffer_state(&ctx->base, &fb); @@ -5730,6 +5739,7 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) ctx->base.bind_blend_state(&ctx->base, blend_state); zink_batch_rp(ctx); + ctx->base.surface_destroy(&ctx->base, psurf); } if (is_compute_only || zink_debug & ZINK_DEBUG_NOREORDER) @@ -5789,15 +5799,15 @@ add_implicit_feedback_loop(struct zink_context *ctx, struct zink_resource *res) return false; /* build attachment array for miplevel/layer checks */ - struct pipe_surface *psurfs[PIPE_MAX_COLOR_BUFS]; + const struct pipe_surface *psurfs[PIPE_MAX_COLOR_BUFS]; unsigned surf_idx = 0; u_foreach_bit(idx, res->fb_binds) { - struct pipe_surface *psurf; + const struct pipe_surface *psurf; if (idx == PIPE_MAX_COLOR_BUFS) - psurf = ctx->fb_state.zsbuf; + psurf = ctx->fb_zsbuf; else - psurf = ctx->fb_state.cbufs[idx]; - if (psurf && psurf->texture == &res->base.b) + psurf = ctx->fb_cbufs[idx]; + if (psurf->texture == &res->base.b) psurfs[surf_idx++] = psurf; } diff --git a/src/gallium/drivers/zink/zink_draw.cpp b/src/gallium/drivers/zink/zink_draw.cpp index 30b5af4c5ef..d840f2ff180 100644 --- a/src/gallium/drivers/zink/zink_draw.cpp +++ b/src/gallium/drivers/zink/zink_draw.cpp @@ -848,12 +848,12 @@ zink_draw(struct pipe_context *pctx, bool is_zs = util_format_is_depth_or_stencil(ctx->sampler_views[MESA_SHADER_FRAGMENT][0]->format); marker = zink_cmd_debug_marker_begin(ctx, VK_NULL_HANDLE, "u_blitter(%s->%s, %dx%d)", util_format_short_name(ctx->sampler_views[MESA_SHADER_FRAGMENT][0]->format), - util_format_short_name((is_zs ? ctx->fb_state.zsbuf : ctx->fb_state.cbufs[0])->format), + util_format_short_name((is_zs ? ctx->fb_state.zsbuf : ctx->fb_state.cbufs[0]).format), lround(viewport.width), lround(viewport.height)); } else { marker = zink_cmd_debug_marker_begin(ctx, VK_NULL_HANDLE, "draw(%u cbufs|%s, %dx%d)", ctx->fb_state.nr_cbufs, - ctx->fb_state.zsbuf ? "zsbuf" : "", + ctx->fb_state.zsbuf.texture ? "zsbuf" : "", lround(viewport.width), lround(viewport.height)); } } diff --git a/src/gallium/drivers/zink/zink_framebuffer.c b/src/gallium/drivers/zink/zink_framebuffer.c index 991bd427bcc..bb46926a299 100644 --- a/src/gallium/drivers/zink/zink_framebuffer.c +++ b/src/gallium/drivers/zink/zink_framebuffer.c @@ -141,7 +141,7 @@ struct zink_framebuffer * zink_get_framebuffer(struct zink_context *ctx) { assert(zink_screen(ctx->base.screen)->info.have_KHR_imageless_framebuffer); - bool have_zsbuf = ctx->fb_state.zsbuf && zink_is_zsbuf_used(ctx); + bool have_zsbuf = ctx->fb_state.zsbuf.texture && zink_is_zsbuf_used(ctx); struct zink_framebuffer_state state; state.num_attachments = ctx->fb_state.nr_cbufs; @@ -149,7 +149,7 @@ zink_get_framebuffer(struct zink_context *ctx) const unsigned cresolve_offset = ctx->fb_state.nr_cbufs + !!have_zsbuf; unsigned num_resolves = 0; for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { - struct pipe_surface *psurf = ctx->fb_state.cbufs[i]; + struct pipe_surface *psurf = ctx->fb_cbufs[i]; if (!psurf) { psurf = zink_get_dummy_pipe_surface(ctx, util_logbase2_ceil(ctx->gfx_pipeline_state.rast_samples+1)); } @@ -166,7 +166,7 @@ zink_get_framebuffer(struct zink_context *ctx) const unsigned zsresolve_offset = cresolve_offset + num_resolves; if (have_zsbuf) { - struct pipe_surface *psurf = ctx->fb_state.zsbuf; + struct pipe_surface *psurf = ctx->fb_zsbuf; struct zink_surface *surface = zink_csurface(psurf); struct zink_surface *transient = zink_transient_surface(psurf); if (transient) { @@ -221,19 +221,19 @@ unsigned zink_framebuffer_get_num_layers(const struct pipe_framebuffer_state *fb) { unsigned i, num_layers = UINT32_MAX; - if (!(fb->nr_cbufs || fb->zsbuf)) + if (!(fb->nr_cbufs || fb->zsbuf.texture)) return MAX2(fb->layers, 1); for (i = 0; i < fb->nr_cbufs; i++) { - if (fb->cbufs[i]) { - unsigned num = fb->cbufs[i]->u.tex.last_layer - - fb->cbufs[i]->u.tex.first_layer + 1; + if (fb->cbufs[i].texture) { + unsigned num = fb->cbufs[i].u.tex.last_layer - + fb->cbufs[i].u.tex.first_layer + 1; num_layers = MIN2(num_layers, num); } } - if (fb->zsbuf) { - unsigned num = fb->zsbuf->u.tex.last_layer - - fb->zsbuf->u.tex.first_layer + 1; + if (fb->zsbuf.texture) { + unsigned num = fb->zsbuf.u.tex.last_layer - + fb->zsbuf.u.tex.first_layer + 1; num_layers = MIN2(num_layers, num); } return MAX2(num_layers, 1); diff --git a/src/gallium/drivers/zink/zink_kopper.c b/src/gallium/drivers/zink/zink_kopper.c index 6561b55081a..711b335b8f1 100644 --- a/src/gallium/drivers/zink/zink_kopper.c +++ b/src/gallium/drivers/zink/zink_kopper.c @@ -1113,19 +1113,19 @@ void zink_kopper_fixup_depth_buffer(struct zink_context *ctx) { struct zink_screen *screen = zink_screen(ctx->base.screen); - if (!ctx->fb_state.zsbuf) + if (!ctx->fb_state.zsbuf.texture) return; - assert(ctx->fb_state.zsbuf->texture->bind & PIPE_BIND_DISPLAY_TARGET); + assert(ctx->fb_state.zsbuf.texture->bind & PIPE_BIND_DISPLAY_TARGET); - struct zink_resource *res = zink_resource(ctx->fb_state.zsbuf->texture); - struct zink_surface *surf = zink_csurface(ctx->fb_state.zsbuf); - struct zink_ctx_surface *csurf = (struct zink_ctx_surface*)ctx->fb_state.zsbuf; + struct zink_resource *res = zink_resource(ctx->fb_state.zsbuf.texture); + struct zink_surface *surf = zink_csurface(ctx->fb_zsbuf); + struct zink_ctx_surface *csurf = (struct zink_ctx_surface*)ctx->fb_zsbuf; if (surf->info.width == ctx->fb_state.width && surf->info.height == ctx->fb_state.height) return; - struct pipe_resource templ = *ctx->fb_state.zsbuf->texture; + struct pipe_resource templ = *ctx->fb_state.zsbuf.texture; templ.width0 = ctx->fb_state.width; templ.height0 = ctx->fb_state.height; struct pipe_resource *pz = screen->base.resource_create(&screen->base, &templ); @@ -1135,7 +1135,7 @@ zink_kopper_fixup_depth_buffer(struct zink_context *ctx) res->base.b.height0 = ctx->fb_state.height; pipe_resource_reference(&pz, NULL); - struct pipe_surface *psurf = ctx->base.create_surface(&ctx->base, &res->base.b, ctx->fb_state.zsbuf); + struct pipe_surface *psurf = ctx->base.create_surface(&ctx->base, &res->base.b, &ctx->fb_state.zsbuf); struct zink_ctx_surface *cz = (struct zink_ctx_surface*)psurf; /* oh god why */ diff --git a/src/gallium/drivers/zink/zink_render_pass.c b/src/gallium/drivers/zink/zink_render_pass.c index 8c457e245ea..78e3a2d01da 100644 --- a/src/gallium/drivers/zink/zink_render_pass.c +++ b/src/gallium/drivers/zink/zink_render_pass.c @@ -359,11 +359,11 @@ void zink_init_zs_attachment(struct zink_context *ctx, struct zink_rt_attrib *rt) { const struct pipe_framebuffer_state *fb = &ctx->fb_state; - struct zink_resource *zsbuf = zink_resource(fb->zsbuf->texture); + struct zink_resource *zsbuf = zink_resource(fb->zsbuf.texture); struct zink_framebuffer_clear *fb_clear = &ctx->fb_clears[PIPE_MAX_COLOR_BUFS]; - struct zink_surface *transient = zink_transient_surface(fb->zsbuf); + struct zink_surface *transient = zink_transient_surface(ctx->fb_zsbuf); rt->format = zsbuf->format; - rt->samples = MAX3(transient ? transient->base.nr_samples : 0, fb->zsbuf->texture->nr_samples, 1); + rt->samples = MAX3(transient ? transient->base.nr_samples : 0, fb->zsbuf.texture->nr_samples, 1); rt->clear_color = zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS) && !zink_fb_clear_first_needs_explicit(fb_clear) && (zink_fb_clear_element(fb_clear, 0)->zs.bits & PIPE_CLEAR_DEPTH); @@ -389,11 +389,11 @@ void zink_tc_init_zs_attachment(struct zink_context *ctx, const struct tc_renderpass_info *info, struct zink_rt_attrib *rt) { const struct pipe_framebuffer_state *fb = &ctx->fb_state; - struct zink_resource *zsbuf = zink_resource(fb->zsbuf->texture); + struct zink_resource *zsbuf = zink_resource(fb->zsbuf.texture); struct zink_framebuffer_clear *fb_clear = &ctx->fb_clears[PIPE_MAX_COLOR_BUFS]; - struct zink_surface *transient = zink_transient_surface(fb->zsbuf); + struct zink_surface *transient = zink_transient_surface(ctx->fb_zsbuf); rt->format = zsbuf->format; - rt->samples = MAX3(transient ? transient->base.nr_samples : 0, fb->zsbuf->texture->nr_samples, 1); + rt->samples = MAX3(transient ? transient->base.nr_samples : 0, fb->zsbuf.texture->nr_samples, 1); rt->clear_color = zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS) && !zink_fb_clear_first_needs_explicit(fb_clear) && (zink_fb_clear_element(fb_clear, 0)->zs.bits & PIPE_CLEAR_DEPTH); @@ -409,7 +409,7 @@ void zink_init_color_attachment(struct zink_context *ctx, unsigned i, struct zink_rt_attrib *rt) { const struct pipe_framebuffer_state *fb = &ctx->fb_state; - struct pipe_surface *psurf = fb->cbufs[i]; + struct pipe_surface *psurf = ctx->fb_cbufs[i]; if (psurf) { struct zink_surface *surf = zink_csurface(psurf); struct zink_surface *transient = zink_transient_surface(psurf); @@ -430,7 +430,7 @@ void zink_tc_init_color_attachment(struct zink_context *ctx, const struct tc_renderpass_info *info, unsigned i, struct zink_rt_attrib *rt) { const struct pipe_framebuffer_state *fb = &ctx->fb_state; - struct pipe_surface *psurf = fb->cbufs[i]; + struct pipe_surface *psurf = ctx->fb_cbufs[i]; if (psurf) { struct zink_surface *surf = zink_csurface(psurf); struct zink_surface *transient = zink_transient_surface(psurf); @@ -454,7 +454,7 @@ get_render_pass(struct zink_context *ctx) const struct pipe_framebuffer_state *fb = &ctx->fb_state; struct zink_render_pass_state state = {0}; uint32_t clears = 0; - bool have_zsbuf = fb->zsbuf && zink_is_zsbuf_used(ctx); + bool have_zsbuf = fb->zsbuf.texture && zink_is_zsbuf_used(ctx); bool use_tc_info = !ctx->blitting && ctx->track_renderpasses; state.samples = fb->samples > 0; @@ -463,7 +463,7 @@ get_render_pass(struct zink_context *ctx) zink_tc_init_color_attachment(ctx, &ctx->dynamic_fb.tc_info, i, &state.rts[i]); else zink_init_color_attachment(ctx, i, &state.rts[i]); - struct pipe_surface *surf = fb->cbufs[i]; + struct pipe_surface *surf = ctx->fb_cbufs[i]; if (surf) { clears |= !!state.rts[i].clear_color ? PIPE_CLEAR_COLOR0 << i : 0; struct zink_surface *transient = zink_transient_surface(surf); @@ -488,7 +488,7 @@ get_render_pass(struct zink_context *ctx) zink_tc_init_zs_attachment(ctx, &ctx->dynamic_fb.tc_info, &state.rts[fb->nr_cbufs]); else zink_init_zs_attachment(ctx, &state.rts[fb->nr_cbufs]); - struct zink_surface *transient = zink_transient_surface(fb->zsbuf); + struct zink_surface *transient = zink_transient_surface(ctx->fb_zsbuf); if (transient) { state.num_zsresolves = 1; state.rts[fb->nr_cbufs].resolve = true; @@ -618,12 +618,12 @@ setup_framebuffer(struct zink_context *ctx) static bool prep_fb_attachments(struct zink_context *ctx, VkImageView *att) { - bool have_zsbuf = ctx->fb_state.zsbuf && zink_is_zsbuf_used(ctx); + bool have_zsbuf = ctx->fb_state.zsbuf.texture && zink_is_zsbuf_used(ctx); const unsigned cresolve_offset = ctx->fb_state.nr_cbufs + !!have_zsbuf; unsigned num_resolves = 0; for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { - struct zink_surface *surf = zink_csurface(ctx->fb_state.cbufs[i]); - struct zink_surface *transient = zink_transient_surface(ctx->fb_state.cbufs[i]); + struct zink_surface *surf = zink_csurface(ctx->fb_cbufs[i]); + struct zink_surface *transient = zink_transient_surface(ctx->fb_cbufs[i]); if (transient) { att[i] = zink_prep_fb_attachment(ctx, transient, i); att[i + cresolve_offset] = zink_prep_fb_attachment(ctx, surf, i); @@ -636,8 +636,8 @@ prep_fb_attachments(struct zink_context *ctx, VkImageView *att) } } if (have_zsbuf) { - struct zink_surface *surf = zink_csurface(ctx->fb_state.zsbuf); - struct zink_surface *transient = zink_transient_surface(ctx->fb_state.zsbuf); + struct zink_surface *surf = zink_csurface(ctx->fb_zsbuf); + struct zink_surface *transient = zink_transient_surface(ctx->fb_zsbuf); if (transient) { att[ctx->fb_state.nr_cbufs] = zink_prep_fb_attachment(ctx, transient, ctx->fb_state.nr_cbufs); att[cresolve_offset + num_resolves] = zink_prep_fb_attachment(ctx, surf, ctx->fb_state.nr_cbufs); @@ -661,8 +661,8 @@ begin_render_pass(struct zink_context *ctx) rpbi.renderArea.extent.width = fb_state->width; rpbi.renderArea.extent.height = fb_state->height; - if (ctx->fb_state.cbufs[0]) { - struct zink_resource *res = zink_resource(ctx->fb_state.cbufs[0]->texture); + if (ctx->fb_state.cbufs[0].texture) { + struct zink_resource *res = zink_resource(ctx->fb_state.cbufs[0].texture); if (zink_is_swapchain(res)) { if (res->use_damage) rpbi.renderArea = res->damage; @@ -674,7 +674,7 @@ begin_render_pass(struct zink_context *ctx) uint32_t clear_validate = 0; for (int i = 0; i < fb_state->nr_cbufs; i++) { /* these are no-ops */ - if (!fb_state->cbufs[i] || !zink_fb_clear_enabled(ctx, i)) + if (!fb_state->cbufs[i].texture || !zink_fb_clear_enabled(ctx, i)) continue; /* these need actual clear calls inside the rp */ struct zink_framebuffer_clear_data *clear = zink_fb_clear_element(&ctx->fb_clears[i], 0); @@ -690,7 +690,7 @@ begin_render_pass(struct zink_context *ctx) clear_validate |= PIPE_CLEAR_COLOR0 << i; assert(ctx->framebuffer->rp->state.clears); } - if (fb_state->zsbuf && zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS)) { + if (fb_state->zsbuf.texture && zink_fb_clear_enabled(ctx, PIPE_MAX_COLOR_BUFS)) { struct zink_framebuffer_clear *fb_clear = &ctx->fb_clears[PIPE_MAX_COLOR_BUFS]; struct zink_framebuffer_clear_data *clear = zink_fb_clear_element(fb_clear, 0); if (!zink_fb_clear_element_needs_explicit(clear)) { @@ -725,14 +725,14 @@ begin_render_pass(struct zink_context *ctx) /* this can be set if fbfetch is activated */ ctx->rp_changed = false; #ifndef NDEBUG - bool zsbuf_used = ctx->fb_state.zsbuf && zink_is_zsbuf_used(ctx); + bool zsbuf_used = ctx->fb_state.zsbuf.texture && zink_is_zsbuf_used(ctx); const unsigned cresolve_offset = ctx->fb_state.nr_cbufs + !!zsbuf_used; unsigned num_cresolves = 0; for (int i = 0; i < ctx->fb_state.nr_cbufs; i++) { - if (ctx->fb_state.cbufs[i]) { - struct zink_surface *surf = zink_csurface(ctx->fb_state.cbufs[i]); - struct zink_surface *transient = zink_transient_surface(ctx->fb_state.cbufs[i]); - if (surf->base.format == ctx->fb_state.cbufs[i]->format) { + if (ctx->fb_state.cbufs[i].texture) { + struct zink_surface *surf = zink_csurface(ctx->fb_cbufs[i]); + struct zink_surface *transient = zink_transient_surface(ctx->fb_cbufs[i]); + if (surf->base.format == ctx->fb_state.cbufs[i].format) { if (transient) { num_cresolves++; assert(zink_resource(transient->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[i].usage); @@ -744,8 +744,8 @@ begin_render_pass(struct zink_context *ctx) } } if (ctx->gfx_pipeline_state.render_pass->state.have_zsbuf) { - struct zink_surface *surf = zink_csurface(ctx->fb_state.zsbuf); - struct zink_surface *transient = zink_transient_surface(ctx->fb_state.zsbuf); + struct zink_surface *surf = zink_csurface(ctx->fb_zsbuf); + struct zink_surface *transient = zink_transient_surface(ctx->fb_zsbuf); if (transient) { assert(zink_resource(transient->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[ctx->fb_state.nr_cbufs].usage); assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[cresolve_offset + num_cresolves].usage); @@ -768,7 +768,7 @@ zink_render_msaa_expand(struct zink_context *ctx, uint32_t msaa_expand_mask) bool blitting = ctx->blitting; u_foreach_bit(i, msaa_expand_mask) { - struct zink_ctx_surface *csurf = (struct zink_ctx_surface*)ctx->fb_state.cbufs[i]; + struct zink_ctx_surface *csurf = (struct zink_ctx_surface*)ctx->fb_cbufs[i]; /* skip replicate blit if the image will be full-cleared */ if ((i == PIPE_MAX_COLOR_BUFS && (ctx->rp_clears_enabled & PIPE_CLEAR_DEPTHSTENCIL)) || (ctx->rp_clears_enabled >> 2) & BITFIELD_BIT(i)) { @@ -779,13 +779,13 @@ zink_render_msaa_expand(struct zink_context *ctx, uint32_t msaa_expand_mask) struct pipe_surface *dst_view = (struct pipe_surface*)csurf->transient; assert(dst_view); struct pipe_sampler_view src_templ, *src_view; - struct pipe_resource *src = ctx->fb_state.cbufs[i]->texture; + struct pipe_resource *src = ctx->fb_state.cbufs[i].texture; struct pipe_box dstbox; u_box_3d(0, 0, 0, ctx->fb_state.width, ctx->fb_state.height, 1 + dst_view->u.tex.last_layer - dst_view->u.tex.first_layer, &dstbox); - util_blitter_default_src_texture(ctx->blitter, &src_templ, src, ctx->fb_state.cbufs[i]->u.tex.level); + util_blitter_default_src_texture(ctx->blitter, &src_templ, src, ctx->fb_state.cbufs[i].u.tex.level); src_view = ctx->base.create_sampler_view(&ctx->base, src, &src_templ); zink_blit_begin(ctx, ZINK_BLIT_SAVE_FB | ZINK_BLIT_SAVE_FS | ZINK_BLIT_SAVE_TEXTURES); @@ -848,7 +848,7 @@ zink_end_render_pass(struct zink_context *ctx) VKCTX(CmdEndRenderPass)(ctx->bs->cmdbuf); for (unsigned i = 0; i < ctx->fb_state.nr_cbufs; i++) { - struct zink_ctx_surface *csurf = (struct zink_ctx_surface*)ctx->fb_state.cbufs[i]; + struct zink_ctx_surface *csurf = (struct zink_ctx_surface*)ctx->fb_cbufs[i]; if (csurf) csurf->transient_init = true; } @@ -890,13 +890,13 @@ zink_render_update_swapchain(struct zink_context *ctx) { bool has_swapchain = false; for (unsigned i = 0; i < ctx->fb_state.nr_cbufs; i++) { - if (!ctx->fb_state.cbufs[i]) + if (!ctx->fb_state.cbufs[i].texture) continue; - struct zink_resource *res = zink_resource(ctx->fb_state.cbufs[i]->texture); + struct zink_resource *res = zink_resource(ctx->fb_state.cbufs[i].texture); if (zink_is_swapchain(res)) { has_swapchain = true; if (zink_kopper_acquire(ctx, res, UINT64_MAX)) - zink_surface_swapchain_update(ctx, zink_csurface(ctx->fb_state.cbufs[i])); + zink_surface_swapchain_update(ctx, zink_csurface(ctx->fb_cbufs[i])); } } return has_swapchain; diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index 0c4cd093737..545fe9f1ffb 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -1829,6 +1829,7 @@ struct zink_context { uint32_t transient_attachments; struct pipe_framebuffer_state fb_state; + PIPE_FB_SURFACES; //STOP USING THIS struct hash_table framebuffer_cache; struct zink_vertex_elements_state *element_state; diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index f6a777397a2..cd57897f11f 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -1727,11 +1727,11 @@ handle_begin_rendering(struct vk_cmd_queue_entry *cmd, if (state->forced_sample_count && imgv->image->vk.samples == 1) state->color_att[i].imgv = create_multisample_surface(state, imgv, state->forced_sample_count, att_needs_replicate(state, imgv, state->color_att[i].load_op)); - state->framebuffer.cbufs[i] = state->color_att[i].imgv->surface; - assert(state->render_area.offset.x + state->render_area.extent.width <= state->framebuffer.cbufs[i]->texture->width0); - assert(state->render_area.offset.y + state->render_area.extent.height <= state->framebuffer.cbufs[i]->texture->height0); + state->framebuffer.cbufs[i] = *state->color_att[i].imgv->surface; + assert(state->render_area.offset.x + state->render_area.extent.width <= state->framebuffer.cbufs[i].texture->width0); + assert(state->render_area.offset.y + state->render_area.extent.height <= state->framebuffer.cbufs[i].texture->height0); } else { - state->framebuffer.cbufs[i] = NULL; + memset(&state->framebuffer.cbufs[i], 0, sizeof(state->framebuffer.cbufs[i])); } } @@ -1761,12 +1761,12 @@ handle_begin_rendering(struct vk_cmd_queue_entry *cmd, state->ds_imgv = create_multisample_surface(state, imgv, state->forced_sample_count, att_needs_replicate(state, imgv, load_op)); } - state->framebuffer.zsbuf = state->ds_imgv->surface; - assert(state->render_area.offset.x + state->render_area.extent.width <= state->framebuffer.zsbuf->texture->width0); - assert(state->render_area.offset.y + state->render_area.extent.height <= state->framebuffer.zsbuf->texture->height0); + state->framebuffer.zsbuf = *state->ds_imgv->surface; + assert(state->render_area.offset.x + state->render_area.extent.width <= state->framebuffer.zsbuf.texture->width0); + assert(state->render_area.offset.y + state->render_area.extent.height <= state->framebuffer.zsbuf.texture->height0); } else { state->ds_imgv = NULL; - state->framebuffer.zsbuf = NULL; + memset(&state->framebuffer.zsbuf, 0, sizeof(state->framebuffer.zsbuf)); } state->pctx->set_framebuffer_state(state->pctx, diff --git a/src/gallium/frontends/nine/nine_state.c b/src/gallium/frontends/nine/nine_state.c index 623f1dc37e6..2a1867663f0 100644 --- a/src/gallium/frontends/nine/nine_state.c +++ b/src/gallium/frontends/nine/nine_state.c @@ -758,23 +758,23 @@ update_framebuffer(struct NineDevice9 *device, bool is_clear) if (rt && rt->desc.Format != D3DFMT_NULL && (mask & (1 << i)) && rt->desc.Width == w && rt->desc.Height == h && rt->base.info.nr_samples == nr_samples) { - fb->cbufs[i] = NineSurface9_GetSurface(rt, sRGB); + fb->cbufs[i] = *NineSurface9_GetSurface(rt, sRGB); context->rt_mask |= 1 << i; fb->nr_cbufs = i + 1; } else { /* Color outputs must match RT slot, * drivers will have to handle NULL entries for GL, too. */ - fb->cbufs[i] = NULL; + memset(&fb->cbufs[i], 0, sizeof(fb->cbufs[0])); } } if (context->ds && context->ds->desc.Width >= w && context->ds->desc.Height >= h && context->ds->base.info.nr_samples == nr_samples) { - fb->zsbuf = NineSurface9_GetSurface(context->ds, 0); + fb->zsbuf = *NineSurface9_GetSurface(context->ds, 0); } else { - fb->zsbuf = NULL; + memset(&fb->zsbuf, 0, sizeof(fb->zsbuf)); } fb->width = w; @@ -2297,7 +2297,7 @@ CSMT_ITEM_NO_WAIT(nine_context_clear_fb, if (Flags & D3DCLEAR_TARGET) bufs |= PIPE_CLEAR_COLOR; /* Ignore Z buffer if not bound */ - if (context->pipe_data.fb.zsbuf != NULL) { + if (context->pipe_data.fb.zsbuf.texture != NULL) { if (Flags & D3DCLEAR_ZBUFFER) bufs |= PIPE_CLEAR_DEPTH; if (Flags & D3DCLEAR_STENCIL) bufs |= PIPE_CLEAR_STENCIL; } diff --git a/src/gallium/frontends/nine/surface9.c b/src/gallium/frontends/nine/surface9.c index e5f2d013c16..3bcfa2b7d43 100644 --- a/src/gallium/frontends/nine/surface9.c +++ b/src/gallium/frontends/nine/surface9.c @@ -210,9 +210,6 @@ NineSurface9_dtor( struct NineSurface9 *This ) if (p_atomic_read(&This->pending_uploads_counter)) nine_csmt_process(This->base.base.device); - pipe_surface_reference(&This->surface[0], NULL); - pipe_surface_reference(&This->surface[1], NULL); - if (!is_worker && This->lock_count && (This->data_internal || This->data)) { /* For is_worker nine_free_worker will handle it */ nine_pointer_strongrelease(This->base.base.device->allocator, @@ -238,7 +235,6 @@ NineSurface9_dtor( struct NineSurface9 *This ) static void NineSurface9_CreatePipeSurfaces( struct NineSurface9 *This ) { - struct pipe_context *pipe; struct pipe_screen *screen = NineDevice9_GetScreen(This->base.base.device); struct pipe_resource *resource = This->base.resource; struct pipe_surface templ; @@ -253,28 +249,16 @@ NineSurface9_CreatePipeSurfaces( struct NineSurface9 *This ) resource->target, 0, 0, resource->bind)) srgb_format = resource->format; - memset(&templ, 0, sizeof(templ)); - templ.format = resource->format; + u_surface_default_template(&templ, resource); templ.u.tex.level = This->level; templ.u.tex.first_layer = This->layer; templ.u.tex.last_layer = This->layer; - pipe = nine_context_get_pipe_acquire(This->base.base.device); + This->surface[0] = templ; - This->surface[0] = pipe->create_surface(pipe, resource, &templ); - - memset(&templ, 0, sizeof(templ)); templ.format = srgb_format; - templ.u.tex.level = This->level; - templ.u.tex.first_layer = This->layer; - templ.u.tex.last_layer = This->layer; - This->surface[1] = pipe->create_surface(pipe, resource, &templ); - - nine_context_get_pipe_release(This->base.base.device); - - assert(This->surface[0]); /* TODO: Handle failure */ - assert(This->surface[1]); + This->surface[1] = templ; } #if MESA_DEBUG || !defined(NDEBUG) @@ -841,8 +825,6 @@ NineSurface9_SetResourceResize( struct NineSurface9 *This, This->stride = nine_format_get_stride(This->base.info.format, This->desc.Width); - pipe_surface_reference(&This->surface[0], NULL); - pipe_surface_reference(&This->surface[1], NULL); NineSurface9_CreatePipeSurfaces(This); } diff --git a/src/gallium/frontends/nine/surface9.h b/src/gallium/frontends/nine/surface9.h index 374860a4554..d40f635ef4e 100644 --- a/src/gallium/frontends/nine/surface9.h +++ b/src/gallium/frontends/nine/surface9.h @@ -20,7 +20,7 @@ struct NineSurface9 /* G3D state */ struct pipe_transfer *transfer; - struct pipe_surface *surface[2]; /* created on-demand (linear, sRGB) */ + struct pipe_surface surface[2]; /* created on-demand (linear, sRGB) */ int lock_count; uint8_t texture; /* rtype of container BaseTex or 0 */ @@ -77,8 +77,7 @@ NineSurface9_MarkContainerDirty( struct NineSurface9 *This ); static inline struct pipe_surface * NineSurface9_GetSurface( struct NineSurface9 *This, int sRGB ) { - assert(This->surface[sRGB]); - return This->surface[sRGB]; + return &This->surface[sRGB]; } static inline struct pipe_resource * diff --git a/src/gallium/frontends/va/postproc.c b/src/gallium/frontends/va/postproc.c index e3e2a8a4f21..c0fad93f7c6 100644 --- a/src/gallium/frontends/va/postproc.c +++ b/src/gallium/frontends/va/postproc.c @@ -107,7 +107,7 @@ vlVaPostProcCompositor(vlVaDriver *drv, enum vl_compositor_deinterlace deinterlace, VAProcPipelineParameterBuffer *param) { - struct pipe_surface **surfaces; + struct pipe_surface *surfaces; struct u_rect src_rect; struct u_rect dst_rect; enum VL_CSC_COLOR_STANDARD color_standard; @@ -128,7 +128,7 @@ vlVaPostProcCompositor(vlVaDriver *drv, return VA_STATUS_ERROR_UNIMPLEMENTED; surfaces = dst->get_surfaces(dst); - if (!surfaces || !surfaces[0]) + if (!surfaces[0].texture) return VA_STATUS_ERROR_INVALID_SURFACE; src_rect.x0 = src_region->x; @@ -226,7 +226,7 @@ vlVaPostProcCompositor(vlVaDriver *drv, vl_compositor_set_buffer_layer(&drv->cstate, &drv->compositor, 0, src, &src_rect, NULL, deinterlace); vl_compositor_set_layer_dst_area(&drv->cstate, 0, &dst_rect); - vl_compositor_render(&drv->cstate, &drv->compositor, surfaces[0], NULL, false); + vl_compositor_render(&drv->cstate, &drv->compositor, &surfaces[0], NULL, false); } drv->cstate.chroma_location = VL_COMPOSITOR_LOCATION_NONE; diff --git a/src/gallium/frontends/va/surface.c b/src/gallium/frontends/va/surface.c index 967216b2bb9..c7289fd99e6 100644 --- a/src/gallium/frontends/va/surface.c +++ b/src/gallium/frontends/va/surface.c @@ -956,7 +956,7 @@ vlVaHandleSurfaceAllocate(vlVaDriver *drv, vlVaSurface *surface, const uint64_t *modifiers, unsigned int modifiers_count) { - struct pipe_surface **surfaces; + struct pipe_surface *surfaces; unsigned i; if (modifiers_count > 0) { @@ -979,20 +979,20 @@ vlVaHandleSurfaceAllocate(vlVaDriver *drv, vlVaSurface *surface, return VA_STATUS_SUCCESS; surfaces = surface->buffer->get_surfaces(surface->buffer); - if (surfaces) { + if (surfaces[0].texture) { for (i = 0; i < VL_MAX_SURFACES; ++i) { union pipe_color_union c; memset(&c, 0, sizeof(c)); - if (!surfaces[i]) + if (!surfaces[i].texture) continue; if (i > !!surface->buffer->interlaced) c.f[0] = c.f[1] = c.f[2] = c.f[3] = 0.5f; uint16_t width, height; - pipe_surface_size(surfaces[i], &width, &height); - drv->pipe->clear_render_target(drv->pipe, surfaces[i], &c, 0, 0, + pipe_surface_size(&surfaces[i], &width, &height); + drv->pipe->clear_render_target(drv->pipe, &surfaces[i], &c, 0, 0, width, height, false); } @@ -1609,7 +1609,7 @@ vlVaExportSurfaceHandle(VADriverContextP ctx, { vlVaDriver *drv; vlVaSurface *surf; - struct pipe_surface **surfaces; + struct pipe_surface *surfaces; struct pipe_screen *screen; VAStatus ret; unsigned int usage; @@ -1653,7 +1653,7 @@ vlVaExportSurfaceHandle(VADriverContextP ctx, #ifdef _WIN32 struct winsys_handle whandle; memset(&whandle, 0, sizeof(struct winsys_handle)); - struct pipe_resource *resource = surfaces[0]->texture; + struct pipe_resource *resource = surfaces[0].texture; if (mem_type == VA_SURFACE_ATTRIB_MEM_TYPE_NTHANDLE) whandle.type = WINSYS_HANDLE_TYPE_FD; @@ -1685,10 +1685,10 @@ vlVaExportSurfaceHandle(VADriverContextP ctx, struct pipe_resource *resource; uint32_t drm_format; - if (!surfaces[p]) + if (!surfaces[p].texture) break; - resource = surfaces[p]->texture; + resource = surfaces[p].texture; drm_format = pipe_format_to_drm_format(resource->format); if (drm_format == DRM_FORMAT_INVALID) { diff --git a/src/gallium/frontends/vdpau/surface.c b/src/gallium/frontends/vdpau/surface.c index 5de3fa43454..53672eada28 100644 --- a/src/gallium/frontends/vdpau/surface.c +++ b/src/gallium/frontends/vdpau/surface.c @@ -434,7 +434,7 @@ void vlVdpVideoSurfaceClear(vlVdpSurface *vlsurf) { struct pipe_context *pipe = vlsurf->device->context; - struct pipe_surface **surfaces; + struct pipe_surface *surfaces; unsigned i; if (!vlsurf->video_buffer) @@ -444,15 +444,15 @@ vlVdpVideoSurfaceClear(vlVdpSurface *vlsurf) for (i = 0; i < VL_MAX_SURFACES; ++i) { union pipe_color_union c = {}; - if (!surfaces[i]) + if (!surfaces[i].texture) continue; if (i > !!vlsurf->templat.interlaced) c.f[0] = c.f[1] = c.f[2] = c.f[3] = 0.5f; uint16_t width, height; - pipe_surface_size(surfaces[i], &width, &height); - pipe->clear_render_target(pipe, surfaces[i], &c, 0, 0, + pipe_surface_size(&surfaces[i], &width, &height); + pipe->clear_render_target(pipe, &surfaces[i], &c, 0, 0, width, height, false); } pipe->flush(pipe, NULL, 0); @@ -517,7 +517,7 @@ VdpStatus vlVdpVideoSurfaceDMABuf(VdpVideoSurface surface, return VDP_STATUS_NO_IMPLEMENTATION; } - surf = p_surf->video_buffer->get_surfaces(p_surf->video_buffer)[plane]; + surf = &p_surf->video_buffer->get_surfaces(p_surf->video_buffer)[plane]; if (!surf) { mtx_unlock(&p_surf->device->mutex); return VDP_STATUS_RESOURCES; diff --git a/src/gallium/frontends/xa/xa_composite.c b/src/gallium/frontends/xa/xa_composite.c index beed269f1c4..e03865fa12d 100644 --- a/src/gallium/frontends/xa/xa_composite.c +++ b/src/gallium/frontends/xa/xa_composite.c @@ -432,8 +432,8 @@ bind_shaders(struct xa_context *ctx, const struct xa_composite *comp) } } - if (ctx->srf->format == PIPE_FORMAT_L8_UNORM || - ctx->srf->format == PIPE_FORMAT_R8_UNORM) + if (ctx->srf.format == PIPE_FORMAT_L8_UNORM || + ctx->srf.format == PIPE_FORMAT_R8_UNORM) fs_traits |= FS_DST_LUMINANCE; shader = xa_shaders_get(ctx->shaders, vs_traits, fs_traits); @@ -519,7 +519,7 @@ xa_composite_prepare(struct xa_context *ctx, return ret; ctx->dst = dst_srf; - renderer_bind_destination(ctx, ctx->srf); + renderer_bind_destination(ctx); ret = bind_composite_blend_state(ctx, comp); if (ret != XA_ERR_NONE) diff --git a/src/gallium/frontends/xa/xa_context.c b/src/gallium/frontends/xa/xa_context.c index 1e7fb932c3d..971912ed037 100644 --- a/src/gallium/frontends/xa/xa_context.c +++ b/src/gallium/frontends/xa/xa_context.c @@ -82,8 +82,6 @@ xa_context_destroy(struct xa_context *r) } xa_ctx_sampler_views_destroy(r); - if (r->srf) - pipe_surface_reference(&r->srf, NULL); if (r->cso) { cso_destroy_context(r->cso); @@ -189,27 +187,19 @@ int xa_ctx_srf_create(struct xa_context *ctx, struct xa_surface *dst) { struct pipe_screen *screen = ctx->pipe->screen; - struct pipe_surface srf_templ; /* * Cache surfaces unless we change render target */ - if (ctx->srf) { - if (ctx->srf->texture == dst->tex) - return XA_ERR_NONE; - - pipe_surface_reference(&ctx->srf, NULL); - } + if (ctx->srf.texture == dst->tex) + return XA_ERR_NONE; if (!screen->is_format_supported(screen, dst->tex->format, PIPE_TEXTURE_2D, 0, 0, PIPE_BIND_RENDER_TARGET)) return -XA_ERR_INVAL; - u_surface_default_template(&srf_templ, dst->tex); - ctx->srf = ctx->pipe->create_surface(ctx->pipe, dst->tex, &srf_templ); - if (!ctx->srf) - return -XA_ERR_NORES; + u_surface_default_template(&ctx->srf, dst->tex); return XA_ERR_NONE; } @@ -234,7 +224,7 @@ xa_copy_prepare(struct xa_context *ctx, int ret = xa_ctx_srf_create(ctx, dst); if (ret != XA_ERR_NONE) return ret; - renderer_copy_prepare(ctx, ctx->srf, src->tex, + renderer_copy_prepare(ctx, src->tex, src->fdesc.xa_format, dst->fdesc.xa_format); ctx->simple_copy = 0; @@ -305,7 +295,7 @@ xa_solid_prepare(struct xa_context *ctx, struct xa_surface *dst, if (ret != XA_ERR_NONE) return ret; - if (ctx->srf->format == PIPE_FORMAT_L8_UNORM) + if (ctx->srf.format == PIPE_FORMAT_L8_UNORM) xa_pixel_to_float4_a8(fg, ctx->solid_color); else xa_pixel_to_float4(fg, ctx->solid_color); @@ -324,7 +314,7 @@ xa_solid_prepare(struct xa_context *ctx, struct xa_surface *dst, vs_traits = VS_SRC_SRC | VS_COMPOSITE; fs_traits = FS_SRC_SRC | VS_COMPOSITE; - renderer_bind_destination(ctx, ctx->srf); + renderer_bind_destination(ctx); bind_solid_blend_state(ctx); cso_set_samplers(ctx->cso, PIPE_SHADER_FRAGMENT, 0, NULL); ctx->pipe->set_sampler_views(ctx->pipe, PIPE_SHADER_FRAGMENT, 0, 0, diff --git a/src/gallium/frontends/xa/xa_priv.h b/src/gallium/frontends/xa/xa_priv.h index cb725d2a403..1c3b6ad1bd9 100644 --- a/src/gallium/frontends/xa/xa_priv.h +++ b/src/gallium/frontends/xa/xa_priv.h @@ -103,7 +103,7 @@ struct xa_context { struct pipe_fence_handle *last_fence; struct xa_surface *src; struct xa_surface *dst; - struct pipe_surface *srf; + struct pipe_surface srf; /* destination scissor state.. we scissor out untouched parts * of the dst for the benefit of tilers: @@ -255,12 +255,10 @@ void renderer_draw_yuv(struct xa_context *r, int dst_y, int dst_w, int dst_h, struct xa_surface *srf[]); -void renderer_bind_destination(struct xa_context *r, - struct pipe_surface *surface); +void renderer_bind_destination(struct xa_context *r); void renderer_init_state(struct xa_context *r); void renderer_copy_prepare(struct xa_context *r, - struct pipe_surface *dst_surface, struct pipe_resource *src_texture, const enum xa_formats src_xa_format, const enum xa_formats dst_xa_format); diff --git a/src/gallium/frontends/xa/xa_renderer.c b/src/gallium/frontends/xa/xa_renderer.c index d3e146beb41..54541f73a53 100644 --- a/src/gallium/frontends/xa/xa_renderer.c +++ b/src/gallium/frontends/xa/xa_renderer.c @@ -319,24 +319,21 @@ setup_vertex_data_yuv(struct xa_context *r, * these concepts are linked. */ void -renderer_bind_destination(struct xa_context *r, - struct pipe_surface *surface) +renderer_bind_destination(struct xa_context *r) { uint16_t width, height; - pipe_surface_size(surface, &width, &height); + pipe_surface_size(&r->srf, &width, &height); - struct pipe_framebuffer_state fb; + struct pipe_framebuffer_state fb = {0}; struct pipe_viewport_state viewport; xa_scissor_reset(r); /* Framebuffer uses actual surface width/height */ - memset(&fb, 0, sizeof fb); - pipe_surface_size(surface, &fb.width, &fb.height); + pipe_surface_size(&r->srf, &fb.width, &fb.height); fb.nr_cbufs = 1; - fb.cbufs[0] = surface; - fb.zsbuf = NULL; + fb.cbufs[0] = r->srf; /* Viewport just touches the bit we're interested in: */ @@ -392,7 +389,6 @@ renderer_set_constants(struct xa_context *r, void renderer_copy_prepare(struct xa_context *r, - struct pipe_surface *dst_surface, struct pipe_resource *src_texture, const enum xa_formats src_xa_format, const enum xa_formats dst_xa_format) @@ -402,12 +398,12 @@ renderer_copy_prepare(struct xa_context *r, struct xa_shader shader; uint32_t fs_traits = FS_COMPOSITE; - assert(screen->is_format_supported(screen, dst_surface->format, + assert(screen->is_format_supported(screen, r->srf.format, PIPE_TEXTURE_2D, 0, 0, PIPE_BIND_RENDER_TARGET)); (void)screen; - renderer_bind_destination(r, dst_surface); + renderer_bind_destination(r); /* set misc state we care about */ { @@ -454,8 +450,8 @@ renderer_copy_prepare(struct xa_context *r, if (src_texture->format == PIPE_FORMAT_L8_UNORM || src_texture->format == PIPE_FORMAT_R8_UNORM) fs_traits |= FS_SRC_LUMINANCE; - if (dst_surface->format == PIPE_FORMAT_L8_UNORM || - dst_surface->format == PIPE_FORMAT_R8_UNORM) + if (r->srf.format == PIPE_FORMAT_L8_UNORM || + r->srf.format == PIPE_FORMAT_R8_UNORM) fs_traits |= FS_DST_LUMINANCE; if (xa_format_a(dst_xa_format) != 0 && xa_format_a(src_xa_format) == 0) diff --git a/src/gallium/frontends/xa/xa_yuv.c b/src/gallium/frontends/xa/xa_yuv.c index 405c9ee9e06..13ac016f775 100644 --- a/src/gallium/frontends/xa/xa_yuv.c +++ b/src/gallium/frontends/xa/xa_yuv.c @@ -130,7 +130,7 @@ xa_yuv_planar_blit(struct xa_context *r, if (ret != XA_ERR_NONE) return -XA_ERR_NORES; - renderer_bind_destination(r, r->srf); + renderer_bind_destination(r); xa_yuv_bind_blend_state(r); xa_yuv_bind_shaders(r); xa_yuv_bind_samplers(r, yuv); diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index dfd18d83ca1..18cbcd4e6fa 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -397,56 +397,6 @@ struct pipe_stencil_ref uint8_t ref_value[2]; }; - -/** - * Note that pipe_surfaces are "texture views for rendering" - * and so in the case of ARB_framebuffer_no_attachment there - * is no pipe_surface state available such that we may - * extract the number of samples and layers. - */ -struct pipe_framebuffer_state -{ - uint16_t width, height; - uint16_t layers; /**< Number of layers in a no-attachment framebuffer */ - uint8_t samples; /**< Number of samples in a no-attachment framebuffer */ - - /** multiple color buffers for multiple render targets */ - uint8_t nr_cbufs; - /** used for multiview */ - uint8_t viewmask; - struct pipe_surface *cbufs[PIPE_MAX_COLOR_BUFS]; - - struct pipe_surface *zsbuf; /**< Z/stencil buffer */ - - struct pipe_resource *resolve; -}; - - -/** - * Texture sampler state. - */ -struct pipe_sampler_state -{ - unsigned wrap_s:3; /**< PIPE_TEX_WRAP_x */ - unsigned wrap_t:3; /**< PIPE_TEX_WRAP_x */ - unsigned wrap_r:3; /**< PIPE_TEX_WRAP_x */ - unsigned min_img_filter:1; /**< PIPE_TEX_FILTER_x */ - unsigned min_mip_filter:2; /**< PIPE_TEX_MIPFILTER_x */ - unsigned mag_img_filter:1; /**< PIPE_TEX_FILTER_x */ - unsigned compare_mode:1; /**< PIPE_TEX_COMPARE_x */ - unsigned compare_func:3; /**< PIPE_FUNC_x */ - unsigned unnormalized_coords:1; /**< Are coords normalized to [0,1]? */ - unsigned max_anisotropy:5; - unsigned seamless_cube_map:1; - unsigned border_color_is_integer:1; - unsigned reduction_mode:2; /**< PIPE_TEX_REDUCTION_x */ - unsigned pad:5; /**< take bits from this for new members */ - float lod_bias; /**< LOD/lambda bias */ - float min_lod, max_lod; /**< LOD clamp range, after bias */ - union pipe_color_union border_color; - enum pipe_format border_color_format; /**< only with PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_FREEDRENO, must be last */ -}; - union pipe_surface_desc { struct { unsigned level; @@ -481,6 +431,55 @@ struct pipe_surface union pipe_surface_desc u; }; +/** + * Note that pipe_surfaces are "texture views for rendering" + * and so in the case of ARB_framebuffer_no_attachment there + * is no pipe_surface state available such that we may + * extract the number of samples and layers. + */ +struct pipe_framebuffer_state +{ + uint16_t width, height; + uint16_t layers; /**< Number of layers in a no-attachment framebuffer */ + uint8_t samples; /**< Number of samples in a no-attachment framebuffer */ + + /** multiple color buffers for multiple render targets */ + uint8_t nr_cbufs; + /** used for multiview */ + uint8_t viewmask; + struct pipe_surface cbufs[PIPE_MAX_COLOR_BUFS]; + + struct pipe_surface zsbuf; /**< Z/stencil buffer */ + + struct pipe_resource *resolve; +}; + + +/** + * Texture sampler state. + */ +struct pipe_sampler_state +{ + unsigned wrap_s:3; /**< PIPE_TEX_WRAP_x */ + unsigned wrap_t:3; /**< PIPE_TEX_WRAP_x */ + unsigned wrap_r:3; /**< PIPE_TEX_WRAP_x */ + unsigned min_img_filter:1; /**< PIPE_TEX_FILTER_x */ + unsigned min_mip_filter:2; /**< PIPE_TEX_MIPFILTER_x */ + unsigned mag_img_filter:1; /**< PIPE_TEX_FILTER_x */ + unsigned compare_mode:1; /**< PIPE_TEX_COMPARE_x */ + unsigned compare_func:3; /**< PIPE_FUNC_x */ + unsigned unnormalized_coords:1; /**< Are coords normalized to [0,1]? */ + unsigned max_anisotropy:5; + unsigned seamless_cube_map:1; + unsigned border_color_is_integer:1; + unsigned reduction_mode:2; /**< PIPE_TEX_REDUCTION_x */ + unsigned pad:5; /**< take bits from this for new members */ + float lod_bias; /**< LOD/lambda bias */ + float min_lod, max_lod; /**< LOD clamp range, after bias */ + union pipe_color_union border_color; + enum pipe_format border_color_format; /**< only with PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_FREEDRENO, must be last */ +}; + struct pipe_tex2d_from_buf { unsigned offset; /**< offset in pixels */ uint16_t row_stride; /**< size of the image row_stride in pixels */ diff --git a/src/gallium/include/pipe/p_video_codec.h b/src/gallium/include/pipe/p_video_codec.h index 4455d881825..598b478bcb1 100644 --- a/src/gallium/include/pipe/p_video_codec.h +++ b/src/gallium/include/pipe/p_video_codec.h @@ -246,7 +246,7 @@ struct pipe_video_buffer /** * get an individual surfaces for each plane */ - struct pipe_surface **(*get_surfaces)(struct pipe_video_buffer *buffer); + struct pipe_surface *(*get_surfaces)(struct pipe_video_buffer *buffer); /* * auxiliary associated data diff --git a/src/intel/ci/iris-kbl-fails.txt b/src/intel/ci/iris-kbl-fails.txt index 7069979a6f5..f5cee77d291 100644 --- a/src/intel/ci/iris-kbl-fails.txt +++ b/src/intel/ci/iris-kbl-fails.txt @@ -4,15 +4,6 @@ glx@glx-multi-window-single-context,Fail glx@glx-swap-pixmap-bad,Fail -# failed to create drawable -# X Error of failed request: BadValue (integer parameter out of range for operation) -# Major opcode of failed request: 53 (X_CreatePixmap) -# Value in failed request: 0x1e -# Serial number of failed request: 1177 -# Current serial number in output stream: 1181 -glx@glx-visuals-depth -pixmap,Fail -glx@glx-visuals-stencil -pixmap,Fail - spec@!opengl 1.0@rasterpos,Fail spec@!opengl 1.0@rasterpos@glsl_vs_gs_linked,Fail @@ -104,3 +95,14 @@ spec@arb_framebuffer_object@execution@msaa-alpha-to-coverage_alpha-to-one,Fail spec@arb_framebuffer_object@execution@msaa-alpha-to-coverage_alpha-to-one_write-z,Fail spec@arb_framebuffer_object@execution@msaa-alpha-to-coverage,Fail +# failed to create drawable +# X Error of failed request: BadValue (integer parameter out of range for operation) +# Major opcode of failed request: 53 (X_CreatePixmap) +# Value in failed request: 0x1e +# Serial number of failed request: 1177 +# Current serial number in output stream: 1181 +#glx@glx-visuals-depth -pixmap,Fail +#glx@glx-visuals-stencil -pixmap,Fail +# undebuggable corner case from !34054 +glx@glx-visuals-depth -pixmap,Crash +glx@glx-visuals-stencil -pixmap,Crash diff --git a/src/mesa/main/blit.c b/src/mesa/main/blit.c index b01d8e2aa53..9a4d0cc4e7e 100644 --- a/src/mesa/main/blit.c +++ b/src/mesa/main/blit.c @@ -364,6 +364,22 @@ validate_depth_buffer(struct gl_context *ctx, struct gl_framebuffer *readFb, return true; } +static void +blit_info_from_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *srcRb, struct gl_renderbuffer *dstRb, struct pipe_blit_info *blit) +{ + if (srcRb) { + blit->src.resource = srcRb->texture; + blit->src.level = srcRb->surface.u.tex.level; + blit->src.box.z = srcRb->surface.u.tex.first_layer; + blit->src.format = _mesa_renderbuffer_get_format(ctx, srcRb); + } + if (dstRb) { + blit->dst.resource = dstRb->texture; + blit->dst.level = dstRb->surface.u.tex.level; + blit->dst.box.z = dstRb->surface.u.tex.first_layer; + blit->dst.format = _mesa_renderbuffer_get_format(ctx, dstRb); + } +} static void do_blit_framebuffer(struct gl_context *ctx, @@ -524,60 +540,44 @@ do_blit_framebuffer(struct gl_context *ctx, } else { struct gl_renderbuffer *srcRb = readFB->_ColorReadBuffer; - struct pipe_surface *srcSurf; if (!srcRb) return; _mesa_update_renderbuffer_surface(ctx, srcRb); - srcSurf = _mesa_renderbuffer_get_surface(ctx, srcRb); - if (!srcSurf) - return; - src_base_fmt = srcRb->_BaseFormat; - blit.src.resource = srcSurf->texture; - blit.src.level = srcSurf->u.tex.level; - blit.src.box.z = srcSurf->u.tex.first_layer; - blit.src.format = srcSurf->format; + blit_info_from_renderbuffer(ctx, srcRb, NULL, &blit); } for (i = 0; i < drawFB->_NumColorDrawBuffers; i++) { struct gl_renderbuffer *dstRb = drawFB->_ColorDrawBuffers[i]; if (dstRb) { - struct pipe_surface *dstSurf; dst_base_fmt = dstRb->_BaseFormat; _mesa_update_renderbuffer_surface(ctx, dstRb); - dstSurf = _mesa_renderbuffer_get_surface(ctx, dstRb); + blit_info_from_renderbuffer(ctx, NULL, dstRb, &blit); - if (dstSurf) { - blit.dst.resource = dstSurf->texture; - blit.dst.level = dstSurf->u.tex.level; - blit.dst.box.z = dstSurf->u.tex.first_layer; - blit.dst.format = dstSurf->format; - - if (dst_base_fmt != src_base_fmt) { - uint8_t map[6]; - /* we may have to add a swizzle to the blit */ - _mesa_compute_component_mapping(src_base_fmt, dst_base_fmt, map); - for (int i = 0; i < 4; i++) { - if (map[i] > MESA_FORMAT_SWIZZLE_W) { - blit.swizzle_enable = true; - blit.swizzle[i] = map[i]; - } else { - /* the swizzle has already been mostly applied, - so don't un-do it; we only want the 0's and 1's - inserted */ - blit.swizzle[i] = i; - } + if (dst_base_fmt != src_base_fmt) { + uint8_t map[6]; + /* we may have to add a swizzle to the blit */ + _mesa_compute_component_mapping(src_base_fmt, dst_base_fmt, map); + for (int i = 0; i < 4; i++) { + if (map[i] > MESA_FORMAT_SWIZZLE_W) { + blit.swizzle_enable = true; + blit.swizzle[i] = map[i]; + } else { + /* the swizzle has already been mostly applied, + so don't un-do it; we only want the 0's and 1's + inserted */ + blit.swizzle[i] = i; } } - ctx->pipe->blit(ctx->pipe, &blit); - dstRb->defined = true; /* front buffer tracking */ } + ctx->pipe->blit(ctx->pipe, &blit); + dstRb->defined = true; /* front buffer tracking */ } } } @@ -590,16 +590,13 @@ do_blit_framebuffer(struct gl_context *ctx, readFB->Attachment[BUFFER_DEPTH].Renderbuffer; struct gl_renderbuffer *dstDepthRb = drawFB->Attachment[BUFFER_DEPTH].Renderbuffer; - struct pipe_surface *dstDepthSurf = - dstDepthRb ? _mesa_renderbuffer_get_surface(ctx, dstDepthRb) : NULL; struct gl_renderbuffer *srcStencilRb = readFB->Attachment[BUFFER_STENCIL].Renderbuffer; struct gl_renderbuffer *dstStencilRb = drawFB->Attachment[BUFFER_STENCIL].Renderbuffer; - struct pipe_surface *dstStencilSurf = - dstStencilRb ? _mesa_renderbuffer_get_surface(ctx, dstStencilRb) : NULL; + blit_info_from_renderbuffer(ctx, srcDepthRb, dstDepthRb, &blit); if (_mesa_has_depthstencil_combined(readFB) && _mesa_has_depthstencil_combined(drawFB)) { blit.mask = 0; @@ -608,17 +605,6 @@ do_blit_framebuffer(struct gl_context *ctx, if (mask & GL_STENCIL_BUFFER_BIT) blit.mask |= PIPE_MASK_S; - blit.dst.resource = dstDepthSurf->texture; - blit.dst.level = dstDepthSurf->u.tex.level; - blit.dst.box.z = dstDepthSurf->u.tex.first_layer; - blit.dst.format = dstDepthSurf->format; - - struct pipe_surface *srcDepthSurface = _mesa_renderbuffer_get_surface(ctx, srcDepthRb); - blit.src.resource = srcDepthRb->texture; - blit.src.level = srcDepthSurface->u.tex.level; - blit.src.box.z = srcDepthSurface->u.tex.first_layer; - blit.src.format = srcDepthSurface->format; - ctx->pipe->blit(ctx->pipe, &blit); } else { @@ -627,33 +613,12 @@ do_blit_framebuffer(struct gl_context *ctx, if (mask & GL_DEPTH_BUFFER_BIT) { blit.mask = PIPE_MASK_Z; - blit.dst.resource = dstDepthSurf->texture; - blit.dst.level = dstDepthSurf->u.tex.level; - blit.dst.box.z = dstDepthSurf->u.tex.first_layer; - blit.dst.format = dstDepthSurf->format; - - struct pipe_surface *srcDepthSurface = _mesa_renderbuffer_get_surface(ctx, srcDepthRb); - blit.src.resource = srcDepthRb->texture; - blit.src.level = srcDepthSurface->u.tex.level; - blit.src.box.z = srcDepthSurface->u.tex.first_layer; - blit.src.format = srcDepthSurface->format; - ctx->pipe->blit(ctx->pipe, &blit); } if (mask & GL_STENCIL_BUFFER_BIT) { blit.mask = PIPE_MASK_S; - - blit.dst.resource = dstStencilSurf->texture; - blit.dst.level = dstStencilSurf->u.tex.level; - blit.dst.box.z = dstStencilSurf->u.tex.first_layer; - blit.dst.format = dstStencilSurf->format; - - struct pipe_surface *srcStencilSurface = _mesa_renderbuffer_get_surface(ctx, srcStencilRb); - blit.src.resource = srcStencilRb->texture; - blit.src.level = srcStencilSurface->u.tex.level; - blit.src.box.z = srcStencilSurface->u.tex.first_layer; - blit.src.format = srcStencilSurface->format; + blit_info_from_renderbuffer(ctx, srcStencilRb, dstStencilRb, &blit); ctx->pipe->blit(ctx->pipe, &blit); } diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index d01aa36b1e3..9810a988f58 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -2551,8 +2551,9 @@ struct gl_renderbuffer GLuint width, GLuint height); struct pipe_resource *texture; - struct pipe_surface *surface_linear; - struct pipe_surface *surface_srgb; + enum pipe_format format_linear; + enum pipe_format format_srgb; + struct pipe_surface surface; GLboolean defined; /**< defined contents? */ struct pipe_transfer *transfer; /**< only used when mapping the resource */ diff --git a/src/mesa/main/renderbuffer.c b/src/mesa/main/renderbuffer.c index 14b66817379..d50b21f9bb9 100644 --- a/src/mesa/main/renderbuffer.c +++ b/src/mesa/main/renderbuffer.c @@ -69,13 +69,6 @@ choose_renderbuffer_format(struct gl_context *ctx, static void delete_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb) { - if (ctx) { - pipe_surface_unref(ctx->pipe, &rb->surface_srgb); - pipe_surface_unref(ctx->pipe, &rb->surface_linear); - } else { - pipe_surface_unref_no_context(&rb->surface_srgb); - pipe_surface_unref_no_context(&rb->surface_linear); - } pipe_resource_reference(&rb->texture, NULL); free(rb->data); free(rb->Label); @@ -148,10 +141,8 @@ renderbuffer_alloc_storage(struct gl_context * ctx, width, height); } - /* Free the old surface and texture + /* Free the old texture */ - pipe_surface_reference(&rb->surface_srgb, NULL); - pipe_surface_reference(&rb->surface_linear, NULL); pipe_resource_reference(&rb->texture, NULL); /* If an sRGB framebuffer is unsupported, sRGB formats behave like linear @@ -288,7 +279,7 @@ renderbuffer_alloc_storage(struct gl_context * ctx, return false; _mesa_update_renderbuffer_surface(ctx, rb); - return _mesa_renderbuffer_get_surface(ctx, rb) != NULL; + return GL_TRUE; } /** @@ -490,11 +481,10 @@ _mesa_map_renderbuffer(struct gl_context *ctx, y2 = y; _mesa_update_renderbuffer_surface(ctx, rb); - const struct pipe_surface *surface = _mesa_renderbuffer_get_surface(ctx, rb); map = pipe_texture_map(pipe, rb->texture, - surface->u.tex.level, - surface->u.tex.first_layer, + rb->surface.u.tex.level, + rb->surface.u.tex.first_layer, transfer_flags, x, y2, w, h, &rb->transfer); if (map) { if (invert) { @@ -527,46 +517,6 @@ _mesa_unmap_renderbuffer(struct gl_context *ctx, rb->transfer = NULL; } -void -_mesa_regen_renderbuffer_surface(struct gl_context *ctx, - struct gl_renderbuffer *rb) -{ - struct pipe_context *pipe = ctx->pipe; - struct pipe_resource *resource = rb->texture; - - struct pipe_surface **psurf = - rb->surface_srgb ? &rb->surface_srgb : &rb->surface_linear; - struct pipe_surface *surf = *psurf; - /* create a new pipe_surface */ - struct pipe_surface surf_tmpl; - memset(&surf_tmpl, 0, sizeof(surf_tmpl)); - surf_tmpl.format = surf->format; - surf_tmpl.nr_samples = rb->rtt_nr_samples; - surf_tmpl.u.tex.level = surf->u.tex.level; - surf_tmpl.u.tex.first_layer = surf->u.tex.first_layer; - surf_tmpl.u.tex.last_layer = surf->u.tex.last_layer; - - /* create -> destroy to avoid blowing up cached surfaces */ - surf = pipe->create_surface(pipe, resource, &surf_tmpl); - pipe_surface_unref(pipe, psurf); -} - -static void -update_renderbuffer_surface(struct gl_context *ctx, struct gl_renderbuffer *rb, struct pipe_surface *surf, bool enable_srgb) -{ - if (enable_srgb) - rb->surface_srgb = surf; - else - rb->surface_linear = surf; -} - -struct pipe_surface * -_mesa_renderbuffer_get_surface(struct gl_context *ctx, struct gl_renderbuffer *rb) -{ - bool enable_srgb = ctx->Color.sRGBEnabled && _mesa_is_format_srgb(rb->Format); - return enable_srgb ? rb->surface_srgb : rb->surface_linear; -} - enum pipe_format _mesa_renderbuffer_get_format(struct gl_context *ctx, struct gl_renderbuffer *rb) { @@ -577,6 +527,7 @@ _mesa_renderbuffer_get_format(struct gl_context *ctx, struct gl_renderbuffer *rb * to determine if the rb is sRGB-capable. */ bool enable_srgb = ctx->Color.sRGBEnabled && _mesa_is_format_srgb(rb->Format); + assert(rb->texture); enum pipe_format format = rb->texture->format; if (rb->is_rtt) { @@ -585,7 +536,15 @@ _mesa_renderbuffer_get_format(struct gl_context *ctx, struct gl_renderbuffer *rb format = stTexObj->surface_format; } - return enable_srgb ? util_format_srgb(format) : util_format_linear(format); + if (util_format_is_depth_or_stencil(format)) { + rb->format_srgb = format; + rb->format_linear = format; + } else { + rb->format_srgb = util_format_srgb(format); + rb->format_linear = util_format_linear(format); + } + + return enable_srgb ? rb->format_srgb : rb->format_linear; } /** @@ -596,7 +555,6 @@ void _mesa_update_renderbuffer_surface(struct gl_context *ctx, struct gl_renderbuffer *rb) { - struct pipe_context *pipe = ctx->pipe; struct pipe_resource *resource = rb->texture; const struct gl_texture_object *stTexObj = NULL; unsigned rtt_width = rb->Width; @@ -604,8 +562,6 @@ _mesa_update_renderbuffer_surface(struct gl_context *ctx, unsigned rtt_depth = rb->Depth; - bool enable_srgb = ctx->Color.sRGBEnabled && - _mesa_is_format_srgb(rb->Format); enum pipe_format format = _mesa_renderbuffer_get_format(ctx, rb); if (rb->is_rtt) { @@ -679,29 +635,10 @@ _mesa_update_renderbuffer_surface(struct gl_context *ctx, } } - struct pipe_surface *surf = _mesa_renderbuffer_get_surface(ctx, rb); - - if (!surf || - surf->texture->nr_samples != rb->NumSamples || - surf->texture->nr_storage_samples != rb->NumStorageSamples || - surf->format != format || - surf->texture != resource || - surf->nr_samples != nr_samples || - 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)); - surf_tmpl.format = format; - surf_tmpl.nr_samples = nr_samples; - surf_tmpl.u.tex.level = level; - surf_tmpl.u.tex.first_layer = first_layer; - surf_tmpl.u.tex.last_layer = last_layer; - - /* create -> destroy to avoid blowing up cached surfaces */ - struct pipe_surface *psurf = pipe->create_surface(pipe, resource, &surf_tmpl); - pipe_surface_unref(pipe, &surf); - update_renderbuffer_surface(ctx, rb, psurf, enable_srgb); - } + rb->surface.format = format; + rb->surface.texture = rb->texture; + rb->surface.nr_samples = nr_samples; + rb->surface.u.tex.level = level; + rb->surface.u.tex.first_layer = first_layer; + rb->surface.u.tex.last_layer = last_layer; } diff --git a/src/mesa/main/renderbuffer.h b/src/mesa/main/renderbuffer.h index 08d14b64643..bc9c9563e0e 100644 --- a/src/mesa/main/renderbuffer.h +++ b/src/mesa/main/renderbuffer.h @@ -69,9 +69,6 @@ _mesa_reference_renderbuffer(struct gl_renderbuffer **ptr, enum pipe_format _mesa_renderbuffer_get_format(struct gl_context *ctx, struct gl_renderbuffer *rb); -struct pipe_surface * -_mesa_renderbuffer_get_surface(struct gl_context *ctx, struct gl_renderbuffer *rb); - void _mesa_map_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb, @@ -85,9 +82,6 @@ _mesa_unmap_renderbuffer(struct gl_context *ctx, struct gl_renderbuffer *rb); void -_mesa_regen_renderbuffer_surface(struct gl_context *ctx, - struct gl_renderbuffer *rb); -void _mesa_update_renderbuffer_surface(struct gl_context *ctx, struct gl_renderbuffer *rb); #ifdef __cplusplus diff --git a/src/mesa/state_tracker/st_atom_framebuffer.c b/src/mesa/state_tracker/st_atom_framebuffer.c index fc7f02a00e1..be937df7074 100644 --- a/src/mesa/state_tracker/st_atom_framebuffer.c +++ b/src/mesa/state_tracker/st_atom_framebuffer.c @@ -150,12 +150,10 @@ st_update_framebuffer_state( struct st_context *st ) unsigned num_multiview_layer = 0; for (i = 0; i < fb->_NumColorDrawBuffers; i++) { - framebuffer.cbufs[i] = NULL; rb = fb->_ColorDrawBuffers[i]; - if (rb) { - if (rb->is_rtt || (rb->texture && - _mesa_is_format_srgb(rb->Format))) { + if (rb && rb->texture) { + if (rb->is_rtt || _mesa_is_format_srgb(rb->Format)) { /* rendering to a GL texture, may have to update surface */ _mesa_update_renderbuffer_surface(ctx, rb); @@ -163,25 +161,22 @@ st_update_framebuffer_state( struct st_context *st ) num_multiview_layer = MAX2(num_multiview_layer, rb->rtt_numviews); } - struct pipe_surface *surface = _mesa_renderbuffer_get_surface(ctx, rb); - if (surface) { - if (surface->context != st->pipe) { - _mesa_regen_renderbuffer_surface(ctx, rb); - } - framebuffer.cbufs[i] = surface; - update_framebuffer_size(&framebuffer, surface); - } + framebuffer.cbufs[i] = rb->surface; + framebuffer.cbufs[i].format = _mesa_renderbuffer_get_format(ctx, rb); + update_framebuffer_size(&framebuffer, &rb->surface); rb->defined = GL_TRUE; /* we'll be drawing something */ + } else { + memset(&framebuffer.cbufs[i], 0, sizeof(framebuffer.cbufs[i])); } } for (i = framebuffer.nr_cbufs; i < PIPE_MAX_COLOR_BUFS; i++) { - framebuffer.cbufs[i] = NULL; + memset(&framebuffer.cbufs[i], 0, sizeof(framebuffer.cbufs[i])); } /* Remove trailing GL_NONE draw buffers. */ while (framebuffer.nr_cbufs && - !framebuffer.cbufs[framebuffer.nr_cbufs-1]) { + !framebuffer.cbufs[framebuffer.nr_cbufs-1].texture) { framebuffer.nr_cbufs--; } @@ -198,27 +193,23 @@ st_update_framebuffer_state( struct st_context *st ) _mesa_update_renderbuffer_surface(ctx, rb); num_multiview_layer = MAX2(num_multiview_layer, rb->rtt_numviews); } - struct pipe_surface *surface = _mesa_renderbuffer_get_surface(ctx, rb); - if (surface && surface->context != ctx->pipe) { - _mesa_regen_renderbuffer_surface(ctx, rb); - } - framebuffer.zsbuf = surface; - if (surface) - update_framebuffer_size(&framebuffer, surface); + framebuffer.zsbuf = rb->surface; + framebuffer.zsbuf.format = rb->texture->format; + update_framebuffer_size(&framebuffer, &rb->surface); + } else { + memset(&framebuffer.zsbuf, 0, sizeof(framebuffer.zsbuf)); } - else - framebuffer.zsbuf = NULL; framebuffer.viewmask = BITFIELD_MASK(num_multiview_layer); #ifndef NDEBUG /* Make sure the resource binding flags were set properly */ for (i = 0; i < framebuffer.nr_cbufs; i++) { - assert(!framebuffer.cbufs[i] || - framebuffer.cbufs[i]->texture->bind & PIPE_BIND_RENDER_TARGET); + assert(!framebuffer.cbufs[i].texture || + framebuffer.cbufs[i].texture->bind & PIPE_BIND_RENDER_TARGET); } - if (framebuffer.zsbuf) { - assert(framebuffer.zsbuf->texture->bind & PIPE_BIND_DEPTH_STENCIL); + if (framebuffer.zsbuf.texture) { + assert(framebuffer.zsbuf.texture->bind & PIPE_BIND_DEPTH_STENCIL); } #endif diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c index 96e109da100..82c77823735 100644 --- a/src/mesa/state_tracker/st_cb_clear.c +++ b/src/mesa/state_tracker/st_cb_clear.c @@ -406,10 +406,10 @@ st_Clear(struct gl_context *ctx, GLbitfield mask) if (b != BUFFER_NONE && mask & (1 << b)) { struct gl_renderbuffer *rb = ctx->DrawBuffer->Attachment[b].Renderbuffer; - struct pipe_surface *surface = _mesa_renderbuffer_get_surface(ctx, rb); + enum pipe_format format = _mesa_renderbuffer_get_format(ctx, rb); int colormask_index = ctx->Extensions.EXT_draw_buffers2 ? i : 0; - if (!rb || !surface) + if (!rb || !rb->texture) continue; unsigned colormask = @@ -419,7 +419,7 @@ st_Clear(struct gl_context *ctx, GLbitfield mask) continue; unsigned surf_colormask = - util_format_colormask(util_format_description(surface->format)); + util_format_colormask(util_format_description(format)); bool scissor = is_scissor_enabled(ctx, rb); if ((scissor && !st->can_scissor_clear) || @@ -434,8 +434,7 @@ st_Clear(struct gl_context *ctx, GLbitfield mask) } if (mask & BUFFER_BIT_DEPTH) { - struct pipe_surface *surface = _mesa_renderbuffer_get_surface(ctx, depthRb); - if (surface && ctx->Depth.Mask) { + if (depthRb->texture && ctx->Depth.Mask) { bool scissor = is_scissor_enabled(ctx, depthRb); if ((scissor && !st->can_scissor_clear) || is_window_rectangle_enabled(ctx)) @@ -446,8 +445,7 @@ st_Clear(struct gl_context *ctx, GLbitfield mask) } } if (mask & BUFFER_BIT_STENCIL) { - struct pipe_surface *surface = _mesa_renderbuffer_get_surface(ctx, stencilRb); - if (surface && !is_stencil_disabled(ctx, stencilRb)) { + if (stencilRb->texture && !is_stencil_disabled(ctx, stencilRb)) { bool scissor = is_scissor_enabled(ctx, stencilRb); if ((scissor && !st->can_scissor_clear) || is_window_rectangle_enabled(ctx) || diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c index bdd8030afa3..4c6adb1f1b4 100644 --- a/src/mesa/state_tracker/st_cb_drawpixels.c +++ b/src/mesa/state_tracker/st_cb_drawpixels.c @@ -952,10 +952,8 @@ draw_stencil_pixels(struct gl_context *ctx, GLint x, GLint y, struct gl_pixelstore_attrib clippedUnpack = *unpack; GLubyte *sValues; GLuint *zValues; - struct pipe_surface *surface; rb = ctx->DrawBuffer->Attachment[BUFFER_STENCIL].Renderbuffer; - surface = _mesa_renderbuffer_get_surface(ctx, rb); if (_mesa_fb_orientation(ctx->DrawBuffer) == Y_0_TOP) { y = ctx->DrawBuffer->Height - y - height; @@ -971,8 +969,8 @@ draw_stencil_pixels(struct gl_context *ctx, GLint x, GLint y, } stmap = pipe_texture_map(pipe, rb->texture, - surface->u.tex.level, - surface->u.tex.first_layer, + rb->surface.u.tex.level, + rb->surface.u.tex.first_layer, usage, x, y, width, height, &pt); @@ -1448,11 +1446,10 @@ copy_stencil_pixels(struct gl_context *ctx, GLint srcx, GLint srcy, assert(util_format_get_blockheight(rbDraw->texture->format) == 1); /* map the stencil buffer */ - struct pipe_surface *surface = _mesa_renderbuffer_get_surface(ctx, rbDraw); drawMap = pipe_texture_map(pipe, - surface->texture, - surface->u.tex.level, - surface->u.tex.first_layer, + rbDraw->surface.texture, + rbDraw->surface.u.tex.level, + rbDraw->surface.u.tex.first_layer, usage, dstx, dsty, width, height, &ptDraw); @@ -1596,25 +1593,23 @@ blit_copy_pixels(struct gl_context *ctx, GLint srcx, GLint srcy, !_mesa_regions_overlap(readX, readY, readX + readW, readY + readH, drawX, drawY, drawX + drawW, drawY + drawH)) { struct pipe_blit_info blit; - struct pipe_surface *read_surface = _mesa_renderbuffer_get_surface(ctx, rbRead); - struct pipe_surface *draw_surface = _mesa_renderbuffer_get_surface(ctx, rbDraw); memset(&blit, 0, sizeof(blit)); blit.src.resource = rbRead->texture; - blit.src.level = read_surface->u.tex.level; + blit.src.level = rbRead->surface.u.tex.level; blit.src.format = rbRead->texture->format; blit.src.box.x = readX; blit.src.box.y = readY; - blit.src.box.z = read_surface->u.tex.first_layer; + blit.src.box.z = rbRead->surface.u.tex.first_layer; blit.src.box.width = readW; blit.src.box.height = readH; blit.src.box.depth = 1; blit.dst.resource = rbDraw->texture; - blit.dst.level = draw_surface->u.tex.level; + blit.dst.level = rbDraw->surface.u.tex.level; blit.dst.format = rbDraw->texture->format; blit.dst.box.x = drawX; blit.dst.box.y = drawY; - blit.dst.box.z = draw_surface->u.tex.first_layer; + blit.dst.box.z = rbDraw->surface.u.tex.first_layer; blit.dst.box.width = drawW; blit.dst.box.height = drawH; blit.dst.box.depth = 1; @@ -1873,15 +1868,14 @@ st_CopyPixels(struct gl_context *ctx, GLint srcx, GLint srcy, /* Copy the src region to the temporary texture. */ { struct pipe_blit_info blit; - struct pipe_surface *read_surface = _mesa_renderbuffer_get_surface(ctx, rbRead); memset(&blit, 0, sizeof(blit)); blit.src.resource = rbRead->texture; - blit.src.level = read_surface->u.tex.level; + blit.src.level = rbRead->surface.u.tex.level; blit.src.format = rbRead->texture->format; blit.src.box.x = readX; blit.src.box.y = readY; - blit.src.box.z = read_surface->u.tex.first_layer; + blit.src.box.z = rbRead->surface.u.tex.first_layer; blit.src.box.width = readW; blit.src.box.height = readH; blit.src.box.depth = 1; diff --git a/src/mesa/state_tracker/st_cb_eglimage.c b/src/mesa/state_tracker/st_cb_eglimage.c index ab7cdd97875..3914024d0a3 100644 --- a/src/mesa/state_tracker/st_cb_eglimage.c +++ b/src/mesa/state_tracker/st_cb_eglimage.c @@ -349,26 +349,19 @@ st_egl_image_target_renderbuffer_storage(struct gl_context *ctx, if (st_get_egl_image(ctx, image_handle, PIPE_BIND_RENDER_TARGET, false, "glEGLImageTargetRenderbufferStorage", &stimg, &native_supported)) { - struct pipe_context *pipe = st_context(ctx)->pipe; - struct pipe_surface *ps, surf_tmpl; + struct pipe_surface surf_tmpl; u_surface_default_template(&surf_tmpl, stimg.texture); - 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; - - rb->Format = st_pipe_format_to_mesa_format(ps->format); - rb->_BaseFormat = st_pipe_format_to_base_format(ps->format); + rb->Format = st_pipe_format_to_mesa_format(surf_tmpl.format); + rb->_BaseFormat = st_pipe_format_to_base_format(surf_tmpl.format); rb->InternalFormat = rb->_BaseFormat; - st_set_ws_renderbuffer_surface(rb, ps); - pipe_surface_reference(&ps, NULL); + st_set_ws_renderbuffer_surface(rb, &surf_tmpl); + pipe_resource_reference(&stimg.texture, NULL); } } diff --git a/src/mesa/state_tracker/st_cb_readpixels.c b/src/mesa/state_tracker/st_cb_readpixels.c index 010cc8a3e85..24841469f19 100644 --- a/src/mesa/state_tracker/st_cb_readpixels.c +++ b/src/mesa/state_tracker/st_cb_readpixels.c @@ -104,7 +104,7 @@ try_pbo_readpixels(struct st_context *st, struct gl_renderbuffer *rb, struct pipe_context *pipe = st->pipe; struct pipe_screen *screen = st->screen; struct cso_context *cso = st->cso_context; - struct pipe_surface *surface = _mesa_renderbuffer_get_surface(st->ctx, rb); + struct pipe_surface *surface = &rb->surface; struct pipe_resource *texture = rb->texture; const struct util_format_description *desc; struct st_pbo_addresses addr; @@ -308,10 +308,9 @@ blit_to_staging(struct st_context *st, struct gl_renderbuffer *rb, if (!dst) return NULL; - struct pipe_surface *surface = _mesa_renderbuffer_get_surface(st->ctx, rb); memset(&blit, 0, sizeof(blit)); blit.src.resource = rb->texture; - blit.src.level = surface->u.tex.level; + blit.src.level = rb->surface.u.tex.level; blit.src.format = src_format; blit.dst.resource = dst; blit.dst.level = 0; @@ -320,7 +319,7 @@ blit_to_staging(struct st_context *st, struct gl_renderbuffer *rb, blit.dst.box.x = 0; blit.src.box.y = y; blit.dst.box.y = 0; - blit.src.box.z = surface->u.tex.first_layer; + blit.src.box.z = rb->surface.u.tex.first_layer; blit.dst.box.z = 0; blit.src.box.width = blit.dst.box.width = width; blit.src.box.height = blit.dst.box.height = height; @@ -349,7 +348,7 @@ try_cached_readpixels(struct st_context *st, struct gl_renderbuffer *rb, { struct pipe_resource *src = rb->texture; struct pipe_resource *dst = NULL; - struct pipe_surface *surface = _mesa_renderbuffer_get_surface(st->ctx, rb); + const struct pipe_surface *surface = &rb->surface; if (ST_DEBUG & DEBUG_NOREADPIXCACHE) return NULL; diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 715c125fa22..728ddb9887a 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -1788,7 +1788,7 @@ try_pbo_upload_common(struct gl_context *ctx, fb.width = width; fb.height = height; fb.nr_cbufs = 1; - fb.cbufs[0] = surface; + fb.cbufs[0] = *surface; cso_set_framebuffer(cso, &fb); } @@ -1840,9 +1840,7 @@ try_pbo_upload(struct gl_context *ctx, GLuint dims, struct gl_texture_image *stImage = texImage; struct gl_texture_object *stObj = texImage->TexObject; struct pipe_resource *texture = stImage->pt; - struct pipe_context *pipe = st->pipe; struct pipe_screen *screen = st->screen; - struct pipe_surface *surface = NULL; struct st_pbo_addresses addr; enum pipe_format src_format; const struct util_format_description *desc; @@ -1915,28 +1913,22 @@ try_pbo_upload(struct gl_context *ctx, GLuint dims, return false; /* Set up the surface */ - { - unsigned level = stObj->pt != stImage->pt - ? 0 : texImage->TexObject->Attrib.MinLevel + texImage->Level; - unsigned max_layer = util_max_layer(texture, level); + unsigned level = stObj->pt != stImage->pt + ? 0 : texImage->TexObject->Attrib.MinLevel + texImage->Level; + unsigned max_layer = util_max_layer(texture, level); - zoffset += texImage->Face + texImage->TexObject->Attrib.MinLayer; + zoffset += texImage->Face + texImage->TexObject->Attrib.MinLayer; - struct pipe_surface templ; - memset(&templ, 0, sizeof(templ)); - templ.format = dst_format; - templ.u.tex.level = level; - templ.u.tex.first_layer = MIN2(zoffset, max_layer); - templ.u.tex.last_layer = MIN2(zoffset + depth - 1, max_layer); + struct pipe_surface templ; + memset(&templ, 0, sizeof(templ)); + templ.format = dst_format; + templ.u.tex.level = level; + templ.u.tex.first_layer = MIN2(zoffset, max_layer); + templ.u.tex.last_layer = MIN2(zoffset + depth - 1, max_layer); + templ.context = st->pipe; + templ.texture = texture; - surface = pipe->create_surface(pipe, texture, &templ); - if (!surface) - return false; - } - - success = try_pbo_upload_common(ctx, surface, &addr, src_format); - - pipe_surface_reference(&surface, NULL); + success = try_pbo_upload_common(ctx, &templ, &addr, src_format); return success; } @@ -2431,28 +2423,16 @@ st_try_pbo_compressed_texsubimage(struct gl_context *ctx, struct pipe_resource *buf, intptr_t buf_offset, const struct st_pbo_addresses *addr_tmpl, - struct pipe_resource *texture, - const struct pipe_surface *surface_templ) + struct pipe_surface *surface_templ) { struct st_context *st = st_context(ctx); - struct pipe_context *pipe = st->pipe; struct st_pbo_addresses addr; - struct pipe_surface *surface = NULL; - bool success; addr = *addr_tmpl; if (!st_pbo_addresses_setup(st, buf, buf_offset, &addr)) return false; - surface = pipe->create_surface(pipe, texture, surface_templ); - if (!surface) - return false; - - success = try_pbo_upload_common(ctx, surface, &addr, surface_templ->format); - - pipe_surface_reference(&surface, NULL); - - return success; + return try_pbo_upload_common(ctx, surface_templ, &addr, surface_templ->format); } void @@ -2558,12 +2538,14 @@ st_CompressedTexSubImage(struct gl_context *ctx, GLuint dims, memset(&templ, 0, sizeof(templ)); templ.format = copy_format; + templ.texture = texture; + templ.context = st->pipe; templ.u.tex.level = level; templ.u.tex.first_layer = MIN2(layer, max_layer); templ.u.tex.last_layer = MIN2(layer + d - 1, max_layer); if (st_try_pbo_compressed_texsubimage(ctx, buf, buf_offset, &addr, - texture, &templ)) + &templ)) return; /* Some drivers can re-interpret surfaces but only one layer at a time. @@ -2573,7 +2555,7 @@ st_CompressedTexSubImage(struct gl_context *ctx, GLuint dims, templ.u.tex.first_layer = MIN2(layer, max_layer); templ.u.tex.last_layer = templ.u.tex.first_layer; if (!st_try_pbo_compressed_texsubimage(ctx, buf, buf_offset, &addr, - texture, &templ)) + &templ)) goto fallback; /* By incrementing layer here, we ensure the fallback only uploads @@ -2825,11 +2807,10 @@ fallback_copy_texsubimage(struct gl_context *ctx, srcY = rb->Height - srcY - height; } - struct pipe_surface *surface = _mesa_renderbuffer_get_surface(ctx, rb); map = pipe_texture_map(pipe, rb->texture, - surface->u.tex.level, - surface->u.tex.first_layer, + rb->surface.u.tex.level, + rb->surface.u.tex.first_layer, PIPE_MAP_READ, srcX, srcY, width, height, &src_trans); @@ -3012,7 +2993,7 @@ st_CopyTexSubImage(struct gl_context *ctx, GLuint dims, !_mesa_is_format_astc_2d(texImage->TexFormat) && texImage->TexFormat != MESA_FORMAT_ETC1_RGB8); - if (!rb || !_mesa_renderbuffer_get_surface(ctx, rb) || !stImage->pt) { + if (!rb || !rb->texture || !stImage->pt) { debug_printf("%s: null rb or stImage\n", __func__); return; } @@ -3060,14 +3041,13 @@ st_CopyTexSubImage(struct gl_context *ctx, GLuint dims, /* Blit the texture. * This supports flipping, format conversions, and downsampling. */ - struct pipe_surface *surface = _mesa_renderbuffer_get_surface(ctx, rb); memset(&blit, 0, sizeof(blit)); blit.src.resource = rb->texture; - blit.src.format = util_format_linear(surface->format); - blit.src.level = surface->u.tex.level; + blit.src.format = rb->format_linear; + blit.src.level = rb->surface.u.tex.level; blit.src.box.x = srcX; blit.src.box.y = srcY0; - blit.src.box.z = surface->u.tex.first_layer; + blit.src.box.z = rb->surface.u.tex.first_layer; blit.src.box.width = width; blit.src.box.height = srcY1 - srcY0; blit.src.box.depth = 1; diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c index b0a05763501..62ffc317054 100644 --- a/src/mesa/state_tracker/st_manager.c +++ b/src/mesa/state_tracker/st_manager.c @@ -193,13 +193,12 @@ void st_set_ws_renderbuffer_surface(struct gl_renderbuffer *rb, struct pipe_surface *surf) { - pipe_surface_reference(&rb->surface_srgb, NULL); - pipe_surface_reference(&rb->surface_linear, NULL); + rb->surface = *surf; if (util_format_is_srgb(surf->format)) - pipe_surface_reference(&rb->surface_srgb, surf); + rb->format_srgb = surf->format; else - pipe_surface_reference(&rb->surface_linear, surf); + rb->format_linear = surf->format; pipe_resource_reference(&rb->texture, surf->texture); rb->Width = pipe_surface_width(surf); @@ -247,7 +246,7 @@ st_framebuffer_validate(struct gl_framebuffer *stfb, for (i = 0; i < stfb->num_statts; i++) { struct gl_renderbuffer *rb; - struct pipe_surface *ps, surf_tmpl; + struct pipe_surface surf_tmpl; gl_buffer_index idx; if (!textures[i]) @@ -269,16 +268,12 @@ st_framebuffer_validate(struct gl_framebuffer *stfb, } u_surface_default_template(&surf_tmpl, textures[i]); - ps = st->pipe->create_surface(st->pipe, textures[i], &surf_tmpl); - if (ps) { - st_set_ws_renderbuffer_surface(rb, ps); - pipe_surface_reference(&ps, NULL); + st_set_ws_renderbuffer_surface(rb, &surf_tmpl); - changed = true; + changed = true; - width = rb->Width; - height = rb->Height; - } + width = rb->Width; + height = rb->Height; pipe_resource_reference(&textures[i], NULL); } diff --git a/src/panfrost/ci/panfrost-g57-fails.txt b/src/panfrost/ci/panfrost-g57-fails.txt index c262fca7cc6..f74879bd5a0 100644 --- a/src/panfrost/ci/panfrost-g57-fails.txt +++ b/src/panfrost/ci/panfrost-g57-fails.txt @@ -295,7 +295,6 @@ spec@arb_texture_float@texwrap formats@GL_INTENSITY16F_ARB- NPOT,Fail spec@arb_texture_float@texwrap formats@GL_INTENSITY16F_ARB- swizzled,Fail spec@arb_timer_query@query gl_timestamp,Fail spec@arb_timer_query@timestamp-get,Fail -spec@ext_clear_texture@ext_clear_texture-base-formats,Fail spec@ext_disjoint_timer_query@simple,Fail spec@ext_image_dma_buf_import@ext_image_dma_buf_import-refcount-multithread,Crash spec@ext_timer_query@time-elapsed,Fail