mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
i965: Make a BRW_NEW_FAST_CLEAR_COLOR dirty bit.
When changing fast clear colors, we need to emit new SURFACE_STATE
with the updated color at the next draw call.
Most things work today because the atoms that handle SURFACE_STATE
for images (mutable images, textures, render targets) also listen to
BRW_NEW_BLORP, causing us to re-emit these on every BLORP operation.
However, this is overkill - most BLORP operations don't require us
to re-emit SURFACE_STATE.
One case where this is broken today is a fast clear to a different
color followed by a non-coherent framebuffer fetch. The renderbuffer
read atom doesn't listen to BRW_NEW_BLORP, and would not get the new
fast clear color.
Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
(cherry picked from commit 54c41af0aa)
[Emil Velikov: squash trivial conflicts]
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Conflicts:
src/mesa/drivers/dri/i965/brw_tcs_surface_state.c
This commit is contained in:
parent
9013f80f67
commit
c0c03d0003
8 changed files with 25 additions and 5 deletions
|
|
@ -822,16 +822,23 @@ do_single_blorp_clear(struct brw_context *brw, struct gl_framebuffer *fb,
|
|||
brw_meta_convert_fast_clear_color(brw, irb->mt,
|
||||
&ctx->Color.ClearColor);
|
||||
|
||||
bool same_clear_color = memcmp(&irb->mt->fast_clear_color,
|
||||
&clear_color, sizeof(clear_color)) == 0;
|
||||
|
||||
/* If the buffer is already in INTEL_FAST_CLEAR_STATE_CLEAR, the clear
|
||||
* is redundant and can be skipped.
|
||||
*/
|
||||
if (aux_state == ISL_AUX_STATE_CLEAR &&
|
||||
memcmp(&irb->mt->fast_clear_color,
|
||||
&clear_color, sizeof(clear_color)) == 0)
|
||||
if (aux_state == ISL_AUX_STATE_CLEAR && same_clear_color)
|
||||
return;
|
||||
|
||||
irb->mt->fast_clear_color = clear_color;
|
||||
|
||||
/* If the clear color has changed, we need to emit a new SURFACE_STATE
|
||||
* on the next draw call.
|
||||
*/
|
||||
if (!same_clear_color)
|
||||
ctx->NewDriverState |= BRW_NEW_FAST_CLEAR_COLOR;
|
||||
|
||||
DBG("%s (fast) to mt %p level %d layers %d+%d\n", __FUNCTION__,
|
||||
irb->mt, irb->mt_level, irb->mt_layer, num_layers);
|
||||
|
||||
|
|
|
|||
|
|
@ -215,6 +215,7 @@ enum brw_state_id {
|
|||
BRW_STATE_VIEWPORT_COUNT,
|
||||
BRW_STATE_CONSERVATIVE_RASTERIZATION,
|
||||
BRW_STATE_DRAW_CALL,
|
||||
BRW_STATE_FAST_CLEAR_COLOR,
|
||||
BRW_NUM_STATE_BITS
|
||||
};
|
||||
|
||||
|
|
@ -306,6 +307,7 @@ enum brw_state_id {
|
|||
#define BRW_NEW_BLORP (1ull << BRW_STATE_BLORP)
|
||||
#define BRW_NEW_CONSERVATIVE_RASTERIZATION (1ull << BRW_STATE_CONSERVATIVE_RASTERIZATION)
|
||||
#define BRW_NEW_DRAW_CALL (1ull << BRW_STATE_DRAW_CALL)
|
||||
#define BRW_NEW_FAST_CLEAR_COLOR (1ull << BRW_STATE_FAST_CLEAR_COLOR)
|
||||
|
||||
struct brw_state_flags {
|
||||
/** State update flags signalled by mesa internals */
|
||||
|
|
|
|||
|
|
@ -133,6 +133,7 @@ const struct brw_tracked_state brw_gs_image_surfaces = {
|
|||
.mesa = _NEW_TEXTURE,
|
||||
.brw = BRW_NEW_BATCH |
|
||||
BRW_NEW_BLORP |
|
||||
BRW_NEW_FAST_CLEAR_COLOR |
|
||||
BRW_NEW_GEOMETRY_PROGRAM |
|
||||
BRW_NEW_GS_PROG_DATA |
|
||||
BRW_NEW_IMAGE_UNITS,
|
||||
|
|
|
|||
|
|
@ -341,6 +341,7 @@ static struct dirty_bit_map brw_bits[] = {
|
|||
DEFINE_BIT(BRW_NEW_VIEWPORT_COUNT),
|
||||
DEFINE_BIT(BRW_NEW_CONSERVATIVE_RASTERIZATION),
|
||||
DEFINE_BIT(BRW_NEW_DRAW_CALL),
|
||||
DEFINE_BIT(BRW_NEW_FAST_CLEAR_COLOR),
|
||||
{0, 0, 0}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -133,6 +133,7 @@ const struct brw_tracked_state brw_tcs_image_surfaces = {
|
|||
.dirty = {
|
||||
.brw = BRW_NEW_BATCH |
|
||||
BRW_NEW_BLORP |
|
||||
BRW_NEW_FAST_CLEAR_COLOR |
|
||||
BRW_NEW_TCS_PROG_DATA |
|
||||
BRW_NEW_IMAGE_UNITS |
|
||||
BRW_NEW_TESS_PROGRAMS,
|
||||
|
|
|
|||
|
|
@ -133,6 +133,7 @@ const struct brw_tracked_state brw_tes_image_surfaces = {
|
|||
.dirty = {
|
||||
.brw = BRW_NEW_BATCH |
|
||||
BRW_NEW_BLORP |
|
||||
BRW_NEW_FAST_CLEAR_COLOR |
|
||||
BRW_NEW_IMAGE_UNITS |
|
||||
BRW_NEW_TESS_PROGRAMS |
|
||||
BRW_NEW_TES_PROG_DATA,
|
||||
|
|
|
|||
|
|
@ -198,6 +198,7 @@ const struct brw_tracked_state brw_vs_image_surfaces = {
|
|||
.mesa = _NEW_TEXTURE,
|
||||
.brw = BRW_NEW_BATCH |
|
||||
BRW_NEW_BLORP |
|
||||
BRW_NEW_FAST_CLEAR_COLOR |
|
||||
BRW_NEW_IMAGE_UNITS |
|
||||
BRW_NEW_VERTEX_PROGRAM |
|
||||
BRW_NEW_VS_PROG_DATA,
|
||||
|
|
|
|||
|
|
@ -1099,7 +1099,8 @@ const struct brw_tracked_state gen6_renderbuffer_surfaces = {
|
|||
.dirty = {
|
||||
.mesa = _NEW_BUFFERS,
|
||||
.brw = BRW_NEW_BATCH |
|
||||
BRW_NEW_BLORP,
|
||||
BRW_NEW_BLORP |
|
||||
BRW_NEW_FAST_CLEAR_COLOR,
|
||||
},
|
||||
.emit = update_renderbuffer_surfaces,
|
||||
};
|
||||
|
|
@ -1182,6 +1183,7 @@ const struct brw_tracked_state brw_renderbuffer_read_surfaces = {
|
|||
.dirty = {
|
||||
.mesa = _NEW_BUFFERS,
|
||||
.brw = BRW_NEW_BATCH |
|
||||
BRW_NEW_FAST_CLEAR_COLOR |
|
||||
BRW_NEW_FRAGMENT_PROGRAM |
|
||||
BRW_NEW_FS_PROG_DATA,
|
||||
},
|
||||
|
|
@ -1278,6 +1280,7 @@ const struct brw_tracked_state brw_texture_surfaces = {
|
|||
.mesa = _NEW_TEXTURE,
|
||||
.brw = BRW_NEW_BATCH |
|
||||
BRW_NEW_BLORP |
|
||||
BRW_NEW_FAST_CLEAR_COLOR |
|
||||
BRW_NEW_FRAGMENT_PROGRAM |
|
||||
BRW_NEW_FS_PROG_DATA |
|
||||
BRW_NEW_GEOMETRY_PROGRAM |
|
||||
|
|
@ -1318,7 +1321,8 @@ const struct brw_tracked_state brw_cs_texture_surfaces = {
|
|||
.mesa = _NEW_TEXTURE,
|
||||
.brw = BRW_NEW_BATCH |
|
||||
BRW_NEW_BLORP |
|
||||
BRW_NEW_COMPUTE_PROGRAM,
|
||||
BRW_NEW_COMPUTE_PROGRAM |
|
||||
BRW_NEW_FAST_CLEAR_COLOR,
|
||||
},
|
||||
.emit = brw_update_cs_texture_surfaces,
|
||||
};
|
||||
|
|
@ -1530,6 +1534,7 @@ const struct brw_tracked_state brw_cs_image_surfaces = {
|
|||
.brw = BRW_NEW_BATCH |
|
||||
BRW_NEW_BLORP |
|
||||
BRW_NEW_CS_PROG_DATA |
|
||||
BRW_NEW_FAST_CLEAR_COLOR |
|
||||
BRW_NEW_IMAGE_UNITS
|
||||
},
|
||||
.emit = brw_upload_cs_image_surfaces,
|
||||
|
|
@ -1716,6 +1721,7 @@ const struct brw_tracked_state brw_wm_image_surfaces = {
|
|||
.mesa = _NEW_TEXTURE,
|
||||
.brw = BRW_NEW_BATCH |
|
||||
BRW_NEW_BLORP |
|
||||
BRW_NEW_FAST_CLEAR_COLOR |
|
||||
BRW_NEW_FRAGMENT_PROGRAM |
|
||||
BRW_NEW_FS_PROG_DATA |
|
||||
BRW_NEW_IMAGE_UNITS
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue