i915g: split up static state
Early Z support is set in the DST_VARS command. Hence split up static state emission to avoid reissuing to much on fragment shader changes, especially the costly dst buffer relocations. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
a99447314c
commit
288504fac7
|
@ -185,6 +185,7 @@ i915_create_context(struct pipe_screen *screen, void *priv)
|
|||
i915->hardware_dirty = ~0;
|
||||
i915->immediate_dirty = ~0;
|
||||
i915->dynamic_dirty = ~0;
|
||||
i915->static_dirty = ~0;
|
||||
i915->flush_dirty = 0;
|
||||
|
||||
return &i915->base;
|
||||
|
|
|
@ -245,9 +245,10 @@ struct i915_context {
|
|||
|
||||
struct i915_state current;
|
||||
unsigned hardware_dirty;
|
||||
unsigned immediate_dirty;
|
||||
unsigned dynamic_dirty;
|
||||
unsigned flush_dirty;
|
||||
unsigned immediate_dirty : I915_MAX_IMMEDIATE;
|
||||
unsigned dynamic_dirty : I915_MAX_DYNAMIC;
|
||||
unsigned static_dirty : 4;
|
||||
unsigned flush_dirty : 2;
|
||||
|
||||
struct i915_winsys_buffer *validation_buffers[2 + 1 + I915_TEX_UNITS];
|
||||
int num_validation_buffers;
|
||||
|
@ -317,6 +318,12 @@ struct i915_context {
|
|||
#define I915_FLUSH_CACHE 1
|
||||
#define I915_PIPELINE_FLUSH 2
|
||||
|
||||
/* split up static state */
|
||||
#define I915_DST_BUF_COLOR 1
|
||||
#define I915_DST_BUF_DEPTH 2
|
||||
#define I915_DST_VARS 4
|
||||
#define I915_DST_RECT 8
|
||||
|
||||
static INLINE
|
||||
void i915_set_flush_dirty(struct i915_context *i915, unsigned flush)
|
||||
{
|
||||
|
|
|
@ -74,6 +74,7 @@ void i915_flush(struct i915_context *i915, struct pipe_fence_handle **fence)
|
|||
i915->hardware_dirty = ~0;
|
||||
i915->immediate_dirty = ~0;
|
||||
i915->dynamic_dirty = ~0;
|
||||
i915->static_dirty = ~0;
|
||||
/* kernel emits flushes in between batchbuffers */
|
||||
i915->flush_dirty = 0;
|
||||
}
|
||||
|
|
|
@ -173,25 +173,31 @@ emit_dynamic(struct i915_context *i915)
|
|||
static void
|
||||
validate_static(struct i915_context *i915, unsigned *batch_space)
|
||||
{
|
||||
*batch_space = 2 + 5; /* including DRAW_RECT */
|
||||
*batch_space = 0;
|
||||
|
||||
if (i915->current.cbuf_bo) {
|
||||
if (i915->current.cbuf_bo && (i915->static_dirty & I915_DST_BUF_COLOR)) {
|
||||
i915->validation_buffers[i915->num_validation_buffers++]
|
||||
= i915->current.cbuf_bo;
|
||||
*batch_space += 3;
|
||||
}
|
||||
|
||||
if (i915->current.depth_bo) {
|
||||
if (i915->current.depth_bo && (i915->static_dirty & I915_DST_BUF_DEPTH)) {
|
||||
i915->validation_buffers[i915->num_validation_buffers++]
|
||||
= i915->current.depth_bo;
|
||||
*batch_space += 3;
|
||||
}
|
||||
|
||||
if (i915->static_dirty & I915_DST_VARS)
|
||||
*batch_space += 2;
|
||||
|
||||
if (i915->static_dirty & I915_DST_RECT)
|
||||
*batch_space += 5;
|
||||
}
|
||||
|
||||
static void
|
||||
emit_static(struct i915_context *i915)
|
||||
{
|
||||
if (i915->current.cbuf_bo) {
|
||||
if (i915->current.cbuf_bo && (i915->static_dirty & I915_DST_BUF_COLOR)) {
|
||||
OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
|
||||
OUT_BATCH(i915->current.cbuf_flags);
|
||||
OUT_RELOC(i915->current.cbuf_bo,
|
||||
|
@ -201,7 +207,7 @@ emit_static(struct i915_context *i915)
|
|||
|
||||
/* What happens if no zbuf??
|
||||
*/
|
||||
if (i915->current.depth_bo) {
|
||||
if (i915->current.depth_bo && (i915->static_dirty & I915_DST_BUF_DEPTH)) {
|
||||
OUT_BATCH(_3DSTATE_BUF_INFO_CMD);
|
||||
OUT_BATCH(i915->current.depth_flags);
|
||||
OUT_RELOC(i915->current.depth_bo,
|
||||
|
@ -209,7 +215,7 @@ emit_static(struct i915_context *i915)
|
|||
0);
|
||||
}
|
||||
|
||||
{
|
||||
if (i915->static_dirty & I915_DST_VARS) {
|
||||
OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD);
|
||||
OUT_BATCH(i915->current.dst_buf_vars);
|
||||
}
|
||||
|
@ -273,7 +279,7 @@ emit_sampler(struct i915_context *i915)
|
|||
if (i915->current.sampler_enable_nr) {
|
||||
int i;
|
||||
|
||||
OUT_BATCH( _3DSTATE_SAMPLER_STATE |
|
||||
OUT_BATCH( _3DSTATE_SAMPLER_STATE |
|
||||
(3 * i915->current.sampler_enable_nr) );
|
||||
|
||||
OUT_BATCH( i915->current.sampler_enable_flags );
|
||||
|
@ -355,11 +361,13 @@ emit_program(struct i915_context *i915)
|
|||
static void
|
||||
emit_draw_rect(struct i915_context *i915)
|
||||
{
|
||||
OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
|
||||
OUT_BATCH(DRAW_RECT_DIS_DEPTH_OFS);
|
||||
OUT_BATCH(i915->current.draw_offset);
|
||||
OUT_BATCH(i915->current.draw_size);
|
||||
OUT_BATCH(i915->current.draw_offset);
|
||||
if (i915->static_dirty & I915_DST_RECT) {
|
||||
OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
|
||||
OUT_BATCH(DRAW_RECT_DIS_DEPTH_OFS);
|
||||
OUT_BATCH(i915->current.draw_offset);
|
||||
OUT_BATCH(i915->current.draw_size);
|
||||
OUT_BATCH(i915->current.draw_offset);
|
||||
}
|
||||
}
|
||||
|
||||
static boolean
|
||||
|
@ -446,5 +454,6 @@ i915_emit_hardware_state(struct i915_context *i915 )
|
|||
i915->hardware_dirty = 0;
|
||||
i915->immediate_dirty = 0;
|
||||
i915->dynamic_dirty = 0;
|
||||
i915->static_dirty = 0;
|
||||
i915->flush_dirty = 0;
|
||||
}
|
||||
|
|
|
@ -83,9 +83,9 @@ 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;
|
||||
unsigned cformat, zformat;
|
||||
unsigned x, y, w, h;
|
||||
unsigned x, y;
|
||||
int layer;
|
||||
uint32_t draw_offset;
|
||||
uint32_t draw_offset, draw_size, dst_buf_vars;
|
||||
|
||||
if (cbuf_surface) {
|
||||
struct i915_texture *tex = i915_texture(cbuf_surface->texture);
|
||||
|
@ -107,6 +107,7 @@ static void update_framebuffer(struct i915_context *i915)
|
|||
x = y = 0;
|
||||
}
|
||||
cformat = translate_format(cformat);
|
||||
i915->static_dirty |= I915_DST_BUF_COLOR;
|
||||
|
||||
/* What happens if no zbuf??
|
||||
*/
|
||||
|
@ -126,25 +127,32 @@ static void update_framebuffer(struct i915_context *i915)
|
|||
i915->current.depth_bo = NULL;
|
||||
zformat = 0;
|
||||
}
|
||||
i915->static_dirty |= I915_DST_BUF_DEPTH;
|
||||
|
||||
i915->current.dst_buf_vars = DSTORG_HORT_BIAS(0x8) | /* .5 */
|
||||
DSTORG_VERT_BIAS(0x8) | /* .5 */
|
||||
LOD_PRECLAMP_OGL |
|
||||
TEX_DEFAULT_COLOR_OGL |
|
||||
cformat |
|
||||
zformat;
|
||||
dst_buf_vars = DSTORG_HORT_BIAS(0x8) | /* .5 */
|
||||
DSTORG_VERT_BIAS(0x8) | /* .5 */
|
||||
LOD_PRECLAMP_OGL |
|
||||
TEX_DEFAULT_COLOR_OGL |
|
||||
cformat |
|
||||
zformat;
|
||||
if (i915->current.dst_buf_vars != dst_buf_vars) {
|
||||
i915->current.dst_buf_vars = dst_buf_vars;
|
||||
i915->static_dirty |= I915_DST_VARS;
|
||||
}
|
||||
|
||||
/* drawing rect calculations */
|
||||
draw_offset = x | (y << 16);
|
||||
draw_size = (i915->framebuffer.width - 1 + x) |
|
||||
((i915->framebuffer.height - 1 + y) << 16);
|
||||
if (i915->current.draw_offset != draw_offset) {
|
||||
i915->current.draw_offset = draw_offset;
|
||||
i915_set_flush_dirty(i915, I915_PIPELINE_FLUSH);
|
||||
i915->static_dirty |= I915_DST_RECT;
|
||||
} else if (i915->current.draw_size != draw_size) {
|
||||
i915->current.draw_size = draw_size;
|
||||
i915->static_dirty |= I915_DST_RECT;
|
||||
}
|
||||
|
||||
w = i915->framebuffer.width;
|
||||
h = i915->framebuffer.height;
|
||||
i915->current.draw_size = (w - 1 + x) | ((h - 1 + y) << 16);
|
||||
|
||||
i915->hardware_dirty |= I915_HW_STATIC;
|
||||
|
||||
/* flush the cache in case we sample from the old renderbuffers */
|
||||
|
|
Loading…
Reference in New Issue