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->hardware_dirty = ~0;
|
||||||
i915->immediate_dirty = ~0;
|
i915->immediate_dirty = ~0;
|
||||||
i915->dynamic_dirty = ~0;
|
i915->dynamic_dirty = ~0;
|
||||||
|
i915->static_dirty = ~0;
|
||||||
i915->flush_dirty = 0;
|
i915->flush_dirty = 0;
|
||||||
|
|
||||||
return &i915->base;
|
return &i915->base;
|
||||||
|
|
|
@ -245,9 +245,10 @@ struct i915_context {
|
||||||
|
|
||||||
struct i915_state current;
|
struct i915_state current;
|
||||||
unsigned hardware_dirty;
|
unsigned hardware_dirty;
|
||||||
unsigned immediate_dirty;
|
unsigned immediate_dirty : I915_MAX_IMMEDIATE;
|
||||||
unsigned dynamic_dirty;
|
unsigned dynamic_dirty : I915_MAX_DYNAMIC;
|
||||||
unsigned flush_dirty;
|
unsigned static_dirty : 4;
|
||||||
|
unsigned flush_dirty : 2;
|
||||||
|
|
||||||
struct i915_winsys_buffer *validation_buffers[2 + 1 + I915_TEX_UNITS];
|
struct i915_winsys_buffer *validation_buffers[2 + 1 + I915_TEX_UNITS];
|
||||||
int num_validation_buffers;
|
int num_validation_buffers;
|
||||||
|
@ -317,6 +318,12 @@ struct i915_context {
|
||||||
#define I915_FLUSH_CACHE 1
|
#define I915_FLUSH_CACHE 1
|
||||||
#define I915_PIPELINE_FLUSH 2
|
#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
|
static INLINE
|
||||||
void i915_set_flush_dirty(struct i915_context *i915, unsigned flush)
|
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->hardware_dirty = ~0;
|
||||||
i915->immediate_dirty = ~0;
|
i915->immediate_dirty = ~0;
|
||||||
i915->dynamic_dirty = ~0;
|
i915->dynamic_dirty = ~0;
|
||||||
|
i915->static_dirty = ~0;
|
||||||
/* kernel emits flushes in between batchbuffers */
|
/* kernel emits flushes in between batchbuffers */
|
||||||
i915->flush_dirty = 0;
|
i915->flush_dirty = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -173,25 +173,31 @@ emit_dynamic(struct i915_context *i915)
|
||||||
static void
|
static void
|
||||||
validate_static(struct i915_context *i915, unsigned *batch_space)
|
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->validation_buffers[i915->num_validation_buffers++]
|
||||||
= i915->current.cbuf_bo;
|
= i915->current.cbuf_bo;
|
||||||
*batch_space += 3;
|
*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->validation_buffers[i915->num_validation_buffers++]
|
||||||
= i915->current.depth_bo;
|
= i915->current.depth_bo;
|
||||||
*batch_space += 3;
|
*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
|
static void
|
||||||
emit_static(struct i915_context *i915)
|
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(_3DSTATE_BUF_INFO_CMD);
|
||||||
OUT_BATCH(i915->current.cbuf_flags);
|
OUT_BATCH(i915->current.cbuf_flags);
|
||||||
OUT_RELOC(i915->current.cbuf_bo,
|
OUT_RELOC(i915->current.cbuf_bo,
|
||||||
|
@ -201,7 +207,7 @@ emit_static(struct i915_context *i915)
|
||||||
|
|
||||||
/* What happens if no zbuf??
|
/* 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(_3DSTATE_BUF_INFO_CMD);
|
||||||
OUT_BATCH(i915->current.depth_flags);
|
OUT_BATCH(i915->current.depth_flags);
|
||||||
OUT_RELOC(i915->current.depth_bo,
|
OUT_RELOC(i915->current.depth_bo,
|
||||||
|
@ -209,7 +215,7 @@ emit_static(struct i915_context *i915)
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
if (i915->static_dirty & I915_DST_VARS) {
|
||||||
OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD);
|
OUT_BATCH(_3DSTATE_DST_BUF_VARS_CMD);
|
||||||
OUT_BATCH(i915->current.dst_buf_vars);
|
OUT_BATCH(i915->current.dst_buf_vars);
|
||||||
}
|
}
|
||||||
|
@ -273,7 +279,7 @@ emit_sampler(struct i915_context *i915)
|
||||||
if (i915->current.sampler_enable_nr) {
|
if (i915->current.sampler_enable_nr) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
OUT_BATCH( _3DSTATE_SAMPLER_STATE |
|
OUT_BATCH( _3DSTATE_SAMPLER_STATE |
|
||||||
(3 * i915->current.sampler_enable_nr) );
|
(3 * i915->current.sampler_enable_nr) );
|
||||||
|
|
||||||
OUT_BATCH( i915->current.sampler_enable_flags );
|
OUT_BATCH( i915->current.sampler_enable_flags );
|
||||||
|
@ -355,11 +361,13 @@ emit_program(struct i915_context *i915)
|
||||||
static void
|
static void
|
||||||
emit_draw_rect(struct i915_context *i915)
|
emit_draw_rect(struct i915_context *i915)
|
||||||
{
|
{
|
||||||
OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
|
if (i915->static_dirty & I915_DST_RECT) {
|
||||||
OUT_BATCH(DRAW_RECT_DIS_DEPTH_OFS);
|
OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
|
||||||
OUT_BATCH(i915->current.draw_offset);
|
OUT_BATCH(DRAW_RECT_DIS_DEPTH_OFS);
|
||||||
OUT_BATCH(i915->current.draw_size);
|
OUT_BATCH(i915->current.draw_offset);
|
||||||
OUT_BATCH(i915->current.draw_offset);
|
OUT_BATCH(i915->current.draw_size);
|
||||||
|
OUT_BATCH(i915->current.draw_offset);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean
|
static boolean
|
||||||
|
@ -446,5 +454,6 @@ i915_emit_hardware_state(struct i915_context *i915 )
|
||||||
i915->hardware_dirty = 0;
|
i915->hardware_dirty = 0;
|
||||||
i915->immediate_dirty = 0;
|
i915->immediate_dirty = 0;
|
||||||
i915->dynamic_dirty = 0;
|
i915->dynamic_dirty = 0;
|
||||||
|
i915->static_dirty = 0;
|
||||||
i915->flush_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 *cbuf_surface = i915->framebuffer.cbufs[0];
|
||||||
struct pipe_surface *depth_surface = i915->framebuffer.zsbuf;
|
struct pipe_surface *depth_surface = i915->framebuffer.zsbuf;
|
||||||
unsigned cformat, zformat;
|
unsigned cformat, zformat;
|
||||||
unsigned x, y, w, h;
|
unsigned x, y;
|
||||||
int layer;
|
int layer;
|
||||||
uint32_t draw_offset;
|
uint32_t draw_offset, draw_size, dst_buf_vars;
|
||||||
|
|
||||||
if (cbuf_surface) {
|
if (cbuf_surface) {
|
||||||
struct i915_texture *tex = i915_texture(cbuf_surface->texture);
|
struct i915_texture *tex = i915_texture(cbuf_surface->texture);
|
||||||
|
@ -107,6 +107,7 @@ static void update_framebuffer(struct i915_context *i915)
|
||||||
x = y = 0;
|
x = y = 0;
|
||||||
}
|
}
|
||||||
cformat = translate_format(cformat);
|
cformat = translate_format(cformat);
|
||||||
|
i915->static_dirty |= I915_DST_BUF_COLOR;
|
||||||
|
|
||||||
/* What happens if no zbuf??
|
/* What happens if no zbuf??
|
||||||
*/
|
*/
|
||||||
|
@ -126,25 +127,32 @@ static void update_framebuffer(struct i915_context *i915)
|
||||||
i915->current.depth_bo = NULL;
|
i915->current.depth_bo = NULL;
|
||||||
zformat = 0;
|
zformat = 0;
|
||||||
}
|
}
|
||||||
|
i915->static_dirty |= I915_DST_BUF_DEPTH;
|
||||||
|
|
||||||
i915->current.dst_buf_vars = DSTORG_HORT_BIAS(0x8) | /* .5 */
|
dst_buf_vars = DSTORG_HORT_BIAS(0x8) | /* .5 */
|
||||||
DSTORG_VERT_BIAS(0x8) | /* .5 */
|
DSTORG_VERT_BIAS(0x8) | /* .5 */
|
||||||
LOD_PRECLAMP_OGL |
|
LOD_PRECLAMP_OGL |
|
||||||
TEX_DEFAULT_COLOR_OGL |
|
TEX_DEFAULT_COLOR_OGL |
|
||||||
cformat |
|
cformat |
|
||||||
zformat;
|
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 */
|
/* drawing rect calculations */
|
||||||
draw_offset = x | (y << 16);
|
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) {
|
if (i915->current.draw_offset != draw_offset) {
|
||||||
i915->current.draw_offset = draw_offset;
|
i915->current.draw_offset = draw_offset;
|
||||||
i915_set_flush_dirty(i915, I915_PIPELINE_FLUSH);
|
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;
|
i915->hardware_dirty |= I915_HW_STATIC;
|
||||||
|
|
||||||
/* flush the cache in case we sample from the old renderbuffers */
|
/* flush the cache in case we sample from the old renderbuffers */
|
||||||
|
|
Loading…
Reference in New Issue