diff options
-rw-r--r-- | .gitlab-ci/deqp-lima-fails.txt | 21 | ||||
-rw-r--r-- | src/gallium/drivers/lima/lima_draw.c | 15 | ||||
-rw-r--r-- | src/gallium/drivers/lima/lima_format.c | 20 | ||||
-rw-r--r-- | src/gallium/drivers/lima/lima_format.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/lima/lima_job.c | 55 | ||||
-rw-r--r-- | src/gallium/drivers/lima/lima_resource.c | 8 | ||||
-rw-r--r-- | src/gallium/drivers/lima/lima_resource.h | 2 |
7 files changed, 84 insertions, 38 deletions
diff --git a/.gitlab-ci/deqp-lima-fails.txt b/.gitlab-ci/deqp-lima-fails.txt index 28948b2adf0..211a0f14052 100644 --- a/.gitlab-ci/deqp-lima-fails.txt +++ b/.gitlab-ci/deqp-lima-fails.txt @@ -4,27 +4,6 @@ dEQP-GLES2.functional.clipping.triangle_vertex.clip_two.clip_neg_x_neg_y_pos_z_a dEQP-GLES2.functional.clipping.triangle_vertex.clip_two.clip_neg_x_pos_y_pos_z_and_pos_x_neg_y_neg_z dEQP-GLES2.functional.clipping.triangle_vertex.clip_two.clip_pos_x_neg_y_pos_z_and_neg_x_pos_y_neg_z dEQP-GLES2.functional.clipping.triangle_vertex.clip_two.clip_pos_x_pos_y_pos_z_and_neg_x_neg_y_neg_z -dEQP-GLES2.functional.depth_stencil_clear.depth_stencil_masked -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.no_rebind_rbo_rgb565_depth_component16 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.no_rebind_rbo_rgb565_stencil_index8 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.no_rebind_rbo_rgb5_a1_depth_component16 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.no_rebind_rbo_rgb5_a1_stencil_index8 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.no_rebind_rbo_rgba4_depth_component16 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.no_rebind_rbo_rgba4_stencil_index8 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.no_rebind_tex2d_rgba_depth_component16 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.no_rebind_tex2d_rgba_stencil_index8 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.no_rebind_tex2d_rgb_depth_component16 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.no_rebind_tex2d_rgb_stencil_index8 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_rbo_rgb565_depth_component16 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_rbo_rgb565_stencil_index8 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_rbo_rgb5_a1_depth_component16 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_rbo_rgb5_a1_stencil_index8 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_rbo_rgba4_depth_component16 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_rbo_rgba4_stencil_index8 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_tex2d_rgba_depth_component16 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_tex2d_rgba_stencil_index8 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_tex2d_rgb_depth_component16 -dEQP-GLES2.functional.fbo.render.recreate_colorbuffer.rebind_tex2d_rgb_stencil_index8 dEQP-GLES2.functional.fbo.render.shared_depthbuffer.rbo_rgb565_depth_component16 dEQP-GLES2.functional.fbo.render.shared_depthbuffer.rbo_rgb5_a1_depth_component16 dEQP-GLES2.functional.fbo.render.shared_depthbuffer.rbo_rgba4_depth_component16 diff --git a/src/gallium/drivers/lima/lima_draw.c b/src/gallium/drivers/lima/lima_draw.c index 47f6d2bfbf5..9b6d972eb1d 100644 --- a/src/gallium/drivers/lima/lima_draw.c +++ b/src/gallium/drivers/lima/lima_draw.c @@ -118,7 +118,7 @@ lima_clear(struct pipe_context *pctx, unsigned buffers, /* 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]); - surf->reload = false; + surf->reload &= ~PIPE_CLEAR_COLOR0; } struct lima_job_clear *clear = &job->clear; @@ -138,11 +138,20 @@ lima_clear(struct pipe_context *pctx, unsigned buffers, float_to_ushort(color->f[0]); } - if (buffers & PIPE_CLEAR_DEPTH) + struct lima_surface *zsbuf = lima_surface(ctx->framebuffer.base.zsbuf); + + if (buffers & PIPE_CLEAR_DEPTH) { clear->depth = util_pack_z(PIPE_FORMAT_Z24X8_UNORM, depth); + if (zsbuf) + zsbuf->reload &= ~PIPE_CLEAR_DEPTH; + } else + clear->depth = 0x00ffffff; - if (buffers & PIPE_CLEAR_STENCIL) + if (buffers & PIPE_CLEAR_STENCIL) { clear->stencil = stencil; + if (zsbuf) + zsbuf->reload &= ~PIPE_CLEAR_STENCIL; + } ctx->dirty |= LIMA_CONTEXT_DIRTY_CLEAR; diff --git a/src/gallium/drivers/lima/lima_format.c b/src/gallium/drivers/lima/lima_format.c index 5fe7e406b31..524d12773e8 100644 --- a/src/gallium/drivers/lima/lima_format.c +++ b/src/gallium/drivers/lima/lima_format.c @@ -44,7 +44,9 @@ #define LIMA_TEXEL_FORMAT_RGBA_8888 0x16 #define LIMA_TEXEL_FORMAT_RGBX_8888 0x17 #define LIMA_TEXEL_FORMAT_ETC1_RGB8 0x20 -#define LIMA_TEXEL_FORMAT_Z24S8 0x2c +#define LIMA_TEXEL_FORMAT_Z24X8 0x2c +/* This format is only used for depth/stencil reload */ +#define LIMA_TEXEL_FORMAT_Z24S8_RLD 0x32 #define LIMA_TEXEL_FORMAT_NONE -1 #define LIMA_PIXEL_FORMAT_B5G6R5 0x00 @@ -81,8 +83,8 @@ static const struct lima_format lima_format_table[] = { /* BGRA_5551 seems to need channel layout 0x8565, it's not a typo */ LIMA_FORMAT(B5G5R5A1_UNORM, BGRA_5551, B5G5R5A1, false, 0x8565), LIMA_FORMAT(B4G4R4A4_UNORM, BGRA_4444, B4G4R4A4, false, 0x8444), - LIMA_FORMAT(Z24_UNORM_S8_UINT, Z24S8, Z24S8, false, 0x0000), - LIMA_FORMAT(Z24X8_UNORM, Z24S8, Z24S8, false, 0x0000), + LIMA_FORMAT(Z24_UNORM_S8_UINT, Z24X8, Z24S8, false, 0x0000), + LIMA_FORMAT(Z24X8_UNORM, Z24X8, Z24S8, false, 0x0000), LIMA_FORMAT(L16_UNORM, L16, NONE, false, 0x0000), LIMA_FORMAT(L8_UNORM, L8, NONE, false, 0x0000), LIMA_FORMAT(A16_UNORM, A16, NONE, false, 0x0000), @@ -132,6 +134,18 @@ lima_format_get_texel(enum pipe_format f) } int +lima_format_get_texel_reload(enum pipe_format f) +{ + switch (f) { + case PIPE_FORMAT_Z24_UNORM_S8_UINT: + case PIPE_FORMAT_Z24X8_UNORM: + return LIMA_TEXEL_FORMAT_Z24S8_RLD; + default: + return lima_format_get_texel(f); + } +} + +int lima_format_get_pixel(enum pipe_format f) { return lima_format_table[f].pixel; diff --git a/src/gallium/drivers/lima/lima_format.h b/src/gallium/drivers/lima/lima_format.h index e3d7e9f9441..29faaac3a7b 100644 --- a/src/gallium/drivers/lima/lima_format.h +++ b/src/gallium/drivers/lima/lima_format.h @@ -32,6 +32,7 @@ bool lima_format_texel_supported(enum pipe_format f); bool lima_format_pixel_supported(enum pipe_format f); int lima_format_get_texel(enum pipe_format f); int lima_format_get_pixel(enum pipe_format f); +int lima_format_get_texel_reload(enum pipe_format f); bool lima_format_get_swap_rb(enum pipe_format f); uint32_t lima_format_get_channel_layout(enum pipe_format f); diff --git a/src/gallium/drivers/lima/lima_job.c b/src/gallium/drivers/lima/lima_job.c index 3a00d689242..c628ff0a4e6 100644 --- a/src/gallium/drivers/lima/lima_job.c +++ b/src/gallium/drivers/lima/lima_job.c @@ -31,6 +31,7 @@ #include "util/ralloc.h" #include "util/os_time.h" #include "util/hash_table.h" +#include "util/format/u_format.h" #include "util/u_upload_mgr.h" #include "util/u_inlines.h" @@ -296,9 +297,8 @@ lima_job_get_damage(struct lima_job *job) } static bool -lima_fb_need_reload(struct lima_job *job) +lima_fb_cbuf_needs_reload(struct lima_job *job) { - /* Depth buffer is always discarded */ if (!(job->key.cbuf && (job->resolve & PIPE_CLEAR_COLOR0))) return false; @@ -312,14 +312,27 @@ lima_fb_need_reload(struct lima_job *job) // return true; return true; } - else if (surf->reload) + else if (surf->reload & PIPE_CLEAR_COLOR0) + return true; + + return false; +} + +static bool +lima_fb_zsbuf_needs_reload(struct lima_job *job) +{ + if (!(job->key.zsbuf && (job->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)))) + return false; + + struct lima_surface *surf = lima_surface(job->key.zsbuf); + if (surf->reload & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)) return true; return false; } static void -lima_pack_reload_plbu_cmd(struct lima_job *job) +lima_pack_reload_plbu_cmd(struct lima_job *job, struct pipe_surface *psurf) { #define lima_reload_render_state_offset 0x0000 #define lima_reload_gl_pos_offset 0x0040 @@ -329,6 +342,7 @@ lima_pack_reload_plbu_cmd(struct lima_job *job) #define lima_reload_buffer_size 0x0140 struct lima_context *ctx = job->ctx; + struct lima_surface *surf = lima_surface(psurf); uint32_t va; void *cpu = lima_job_create_stream_bo( @@ -353,12 +367,27 @@ lima_pack_reload_plbu_cmd(struct lima_job *job) .aux0 = 0x00004021, .varyings_address = va + lima_reload_varying_offset, }; + + if (util_format_is_depth_or_stencil(psurf->format)) { + reload_render_state.alpha_blend &= 0x0fffffff; + reload_render_state.depth_test |= 0x400; + if (surf->reload & PIPE_CLEAR_DEPTH) + reload_render_state.depth_test |= 0x801; + if (surf->reload & PIPE_CLEAR_STENCIL) { + reload_render_state.depth_test |= 0x1000; + reload_render_state.stencil_front = 0x0000024f; + reload_render_state.stencil_back = 0x0000024f; + reload_render_state.stencil_test = 0x0000ffff; + } + } + memcpy(cpu + lima_reload_render_state_offset, &reload_render_state, sizeof(reload_render_state)); lima_tex_desc *td = cpu + lima_reload_tex_desc_offset; memset(td, 0, lima_min_tex_desc_size); - lima_texture_desc_set_res(ctx, td, job->key.cbuf->texture, 0, 0); + lima_texture_desc_set_res(ctx, td, psurf->texture, 0, 0); + td->format = lima_format_get_texel_reload(psurf->format); td->unnorm_coords = 1; td->texture_type = LIMA_TEXTURE_TYPE_2D; td->min_img_filter_nearest = 1; @@ -426,8 +455,11 @@ lima_pack_head_plbu_cmd(struct lima_job *job) PLBU_CMD_END(); - if (lima_fb_need_reload(job)) - lima_pack_reload_plbu_cmd(job); + if (lima_fb_cbuf_needs_reload(job)) + lima_pack_reload_plbu_cmd(job, job->key.cbuf); + + if (lima_fb_zsbuf_needs_reload(job)) + lima_pack_reload_plbu_cmd(job, job->key.zsbuf); } static void @@ -986,10 +1018,15 @@ lima_do_job(struct lima_job *job) ctx->plb_index = (ctx->plb_index + 1) % lima_ctx_num_plb; + /* Set reload flags for next draw. It'll be unset if buffer is cleared */ if (job->key.cbuf && (job->resolve & PIPE_CLEAR_COLOR0)) { - /* Set reload flag for next draw. It'll be unset if buffer is cleared */ struct lima_surface *surf = lima_surface(job->key.cbuf); - surf->reload = true; + surf->reload = PIPE_CLEAR_COLOR0; + } + + if (job->key.zsbuf && (job->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL))) { + struct lima_surface *surf = lima_surface(job->key.zsbuf); + surf->reload = (job->resolve & (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)); } if (ctx->job == job) diff --git a/src/gallium/drivers/lima/lima_resource.c b/src/gallium/drivers/lima/lima_resource.c index 9f429f8c32a..e60a46b7ae8 100644 --- a/src/gallium/drivers/lima/lima_resource.c +++ b/src/gallium/drivers/lima/lima_resource.c @@ -508,7 +508,13 @@ lima_surface_create(struct pipe_context *pctx, surf->tiled_w = align(psurf->width, 16) >> 4; surf->tiled_h = align(psurf->height, 16) >> 4; - surf->reload = true; + surf->reload = 0; + if (util_format_has_stencil(util_format_description(psurf->format))) + surf->reload |= PIPE_CLEAR_STENCIL; + if (util_format_has_depth(util_format_description(psurf->format))) + surf->reload |= PIPE_CLEAR_DEPTH; + if (!util_format_is_depth_or_stencil(psurf->format)) + surf->reload |= PIPE_CLEAR_COLOR0; return &surf->base; } diff --git a/src/gallium/drivers/lima/lima_resource.h b/src/gallium/drivers/lima/lima_resource.h index 0b2d150b5ee..36ea605c6b0 100644 --- a/src/gallium/drivers/lima/lima_resource.h +++ b/src/gallium/drivers/lima/lima_resource.h @@ -62,7 +62,7 @@ struct lima_resource { struct lima_surface { struct pipe_surface base; int tiled_w, tiled_h; - bool reload; + unsigned reload; }; struct lima_transfer { |