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:
Daniel Vetter 2011-02-26 15:53:01 +01:00
parent beaf039f97
commit f58c11af72
3 changed files with 48 additions and 48 deletions

View File

@ -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 */
};

View File

@ -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

View File

@ -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;
}