i915g: cleanup static state calculation, part 2
Now also for the DRAW_RECT command Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
beaf039f97
commit
f58c11af72
|
@ -156,6 +156,8 @@ struct i915_state
|
|||
struct i915_winsys_buffer *depth_bo;
|
||||
unsigned depth_flags;
|
||||
unsigned dst_buf_vars;
|
||||
uint32_t draw_offset;
|
||||
uint32_t draw_size;
|
||||
|
||||
unsigned id; /* track lost context events */
|
||||
};
|
||||
|
|
|
@ -37,29 +37,6 @@
|
|||
|
||||
#include "util/u_math.h"
|
||||
|
||||
/**
|
||||
* Examine framebuffer state to determine width, height.
|
||||
*/
|
||||
static boolean
|
||||
framebuffer_size(const struct pipe_framebuffer_state *fb,
|
||||
uint *width, uint *height)
|
||||
{
|
||||
if (fb->cbufs[0]) {
|
||||
*width = fb->cbufs[0]->width;
|
||||
*height = fb->cbufs[0]->height;
|
||||
return TRUE;
|
||||
}
|
||||
else if (fb->zsbuf) {
|
||||
*width = fb->zsbuf->width;
|
||||
*height = fb->zsbuf->height;
|
||||
return TRUE;
|
||||
}
|
||||
else {
|
||||
*width = *height = 0;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Push the state into the sarea and/or texture memory.
|
||||
*/
|
||||
|
@ -330,35 +307,13 @@ i915_emit_hardware_state(struct i915_context *i915 )
|
|||
/* 6 dwords, 0 relocs */
|
||||
if (i915->hardware_dirty & I915_HW_STATIC)
|
||||
{
|
||||
uint w, h;
|
||||
struct pipe_surface *cbuf_surface = i915->framebuffer.cbufs[0];
|
||||
unsigned x, y;
|
||||
int layer;
|
||||
uint32_t draw_offset;
|
||||
boolean ret;
|
||||
|
||||
ret = framebuffer_size(&i915->framebuffer, &w, &h);
|
||||
assert(ret);
|
||||
|
||||
if (cbuf_surface) {
|
||||
struct i915_texture *tex = i915_texture(cbuf_surface->texture);
|
||||
layer = cbuf_surface->u.tex.first_layer;
|
||||
|
||||
x = tex->image_offset[cbuf_surface->u.tex.level][layer].nblocksx;
|
||||
y = tex->image_offset[cbuf_surface->u.tex.level][layer].nblocksy;
|
||||
|
||||
} else
|
||||
x = y = 0;
|
||||
|
||||
draw_offset = x | (y << 16);
|
||||
|
||||
/* XXX flush only required when the draw_offset changes! */
|
||||
OUT_BATCH(MI_FLUSH | INHIBIT_FLUSH_RENDER_CACHE);
|
||||
OUT_BATCH(_3DSTATE_DRAW_RECT_CMD);
|
||||
OUT_BATCH(DRAW_RECT_DIS_DEPTH_OFS);
|
||||
OUT_BATCH(draw_offset);
|
||||
OUT_BATCH((w - 1 + x) | ((h - 1 + y) << 16));
|
||||
OUT_BATCH(draw_offset);
|
||||
OUT_BATCH(i915->current.draw_offset);
|
||||
OUT_BATCH(i915->current.draw_size);
|
||||
OUT_BATCH(i915->current.draw_offset);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -78,11 +78,38 @@ buf_3d_tiling_bits(enum i915_winsys_buffer_tile tiling)
|
|||
return tiling_bits;
|
||||
}
|
||||
|
||||
/**
|
||||
* Examine framebuffer state to determine width, height.
|
||||
*/
|
||||
static boolean
|
||||
framebuffer_size(const struct pipe_framebuffer_state *fb,
|
||||
uint *width, uint *height)
|
||||
{
|
||||
if (fb->cbufs[0]) {
|
||||
*width = fb->cbufs[0]->width;
|
||||
*height = fb->cbufs[0]->height;
|
||||
return TRUE;
|
||||
}
|
||||
else if (fb->zsbuf) {
|
||||
*width = fb->zsbuf->width;
|
||||
*height = fb->zsbuf->height;
|
||||
return TRUE;
|
||||
}
|
||||
else {
|
||||
*width = *height = 0;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
int layer;
|
||||
uint32_t draw_offset;
|
||||
boolean ret;
|
||||
|
||||
if (cbuf_surface) {
|
||||
struct i915_texture *tex = i915_texture(cbuf_surface->texture);
|
||||
|
@ -93,9 +120,15 @@ static void update_framebuffer(struct i915_context *i915)
|
|||
BUF_3D_PITCH(tex->stride) | /* pitch in bytes */
|
||||
buf_3d_tiling_bits(tex->tiling);
|
||||
cformat = cbuf_surface->format;
|
||||
|
||||
layer = cbuf_surface->u.tex.first_layer;
|
||||
|
||||
x = tex->image_offset[cbuf_surface->u.tex.level][layer].nblocksx;
|
||||
y = tex->image_offset[cbuf_surface->u.tex.level][layer].nblocksy;
|
||||
} else {
|
||||
i915->current.cbuf_bo = NULL;
|
||||
cformat = PIPE_FORMAT_B8G8R8A8_UNORM; /* arbitrary */
|
||||
x = y = 0;
|
||||
}
|
||||
cformat = translate_format(cformat);
|
||||
|
||||
|
@ -125,6 +158,16 @@ static void update_framebuffer(struct i915_context *i915)
|
|||
cformat |
|
||||
zformat;
|
||||
|
||||
/* drawing rect calculations */
|
||||
draw_offset = x | (y << 16);
|
||||
ret = framebuffer_size(&i915->framebuffer, &w, &h);
|
||||
assert(ret);
|
||||
if (i915->current.draw_offset != draw_offset) {
|
||||
i915->current.draw_offset = draw_offset;
|
||||
/* XXX: only emit flush on change and not always in emit */
|
||||
}
|
||||
i915->current.draw_size = (w - 1 + x) | ((h - 1 + y) << 16);
|
||||
|
||||
i915->hardware_dirty |= I915_HW_STATIC;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue