[intel] Cleanup of */intel_blit.c to bring the two closer.
This commit is contained in:
@@ -45,11 +45,13 @@
|
||||
|
||||
#define FILE_DEBUG_FLAG DEBUG_BLIT
|
||||
|
||||
/*
|
||||
* Copy the back buffer to the front buffer.
|
||||
/**
|
||||
* Copy the back color buffer to the front color buffer.
|
||||
* Used for SwapBuffers().
|
||||
*/
|
||||
void intelCopyBuffer( __DRIdrawablePrivate *dPriv,
|
||||
const drm_clip_rect_t *rect )
|
||||
void
|
||||
intelCopyBuffer(__DRIdrawablePrivate *dPriv,
|
||||
const drm_clip_rect_t *rect)
|
||||
{
|
||||
struct intel_context *intel;
|
||||
GLboolean missed_target;
|
||||
@@ -75,7 +77,7 @@ void intelCopyBuffer( __DRIdrawablePrivate *dPriv,
|
||||
/* The LOCK_HARDWARE is required for the cliprects. Buffer offsets
|
||||
* should work regardless.
|
||||
*/
|
||||
LOCK_HARDWARE( intel );
|
||||
LOCK_HARDWARE(intel);
|
||||
|
||||
if (!rect)
|
||||
{
|
||||
@@ -87,13 +89,13 @@ void intelCopyBuffer( __DRIdrawablePrivate *dPriv,
|
||||
{
|
||||
intelScreenPrivate *intelScreen = intel->intelScreen;
|
||||
__DRIdrawablePrivate *dPriv = intel->driDrawable;
|
||||
struct intel_region *src, *dst;
|
||||
int nbox = dPriv->numClipRects;
|
||||
drm_clip_rect_t *pbox = dPriv->pClipRects;
|
||||
int cpp = intelScreen->cpp;
|
||||
struct intel_region *src, *dst;
|
||||
int src_pitch, dst_pitch;
|
||||
int BR13, CMD;
|
||||
int i;
|
||||
int src_pitch, dst_pitch;
|
||||
|
||||
if (intel->sarea->pf_current_page == 0) {
|
||||
dst = intel->front_region;
|
||||
@@ -109,11 +111,11 @@ void intelCopyBuffer( __DRIdrawablePrivate *dPriv,
|
||||
dst_pitch = dst->pitch * dst->cpp;
|
||||
|
||||
if (cpp == 2) {
|
||||
BR13 = (0xCC << 16) | (1<<24);
|
||||
BR13 = (0xCC << 16) | (1 << 24);
|
||||
CMD = XY_SRC_COPY_BLT_CMD;
|
||||
}
|
||||
else {
|
||||
BR13 = (0xCC << 16) | (1<<24) | (1<<25);
|
||||
BR13 = (0xCC << 16) | (1 << 24) | (1 << 25);
|
||||
CMD = XY_SRC_COPY_BLT_CMD | XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;
|
||||
}
|
||||
|
||||
@@ -121,48 +123,45 @@ void intelCopyBuffer( __DRIdrawablePrivate *dPriv,
|
||||
CMD |= XY_SRC_TILED;
|
||||
src_pitch /= 4;
|
||||
}
|
||||
|
||||
if (dst->tiled) {
|
||||
CMD |= XY_DST_TILED;
|
||||
dst_pitch /= 4;
|
||||
}
|
||||
|
||||
for (i = 0 ; i < nbox; i++, pbox++)
|
||||
{
|
||||
drm_clip_rect_t tmp = *pbox;
|
||||
for (i = 0; i < nbox; i++, pbox++) {
|
||||
drm_clip_rect_t box = *pbox;
|
||||
|
||||
if (rect) {
|
||||
if (!intel_intersect_cliprects(&tmp, &tmp, rect))
|
||||
if (!intel_intersect_cliprects(&box, &box, rect))
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (tmp.x1 > tmp.x2 ||
|
||||
tmp.y1 > tmp.y2 ||
|
||||
tmp.x2 > intelScreen->width ||
|
||||
tmp.y2 > intelScreen->height)
|
||||
if (box.x1 > box.x2 ||
|
||||
box.y1 > box.y2 ||
|
||||
box.x2 > intelScreen->width ||
|
||||
box.y2 > intelScreen->height)
|
||||
continue;
|
||||
|
||||
BEGIN_BATCH(8, INTEL_BATCH_NO_CLIPRECTS);
|
||||
OUT_BATCH( CMD );
|
||||
OUT_BATCH( dst_pitch | BR13 );
|
||||
OUT_BATCH( (tmp.y1 << 16) | tmp.x1 );
|
||||
OUT_BATCH( (tmp.y2 << 16) | tmp.x2 );
|
||||
OUT_RELOC( dst->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE, 0 );
|
||||
OUT_BATCH( (tmp.y1 << 16) | tmp.x1 );
|
||||
OUT_BATCH( src_pitch );
|
||||
OUT_RELOC( src->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ, 0 );
|
||||
OUT_BATCH(CMD);
|
||||
OUT_BATCH(BR13 | dst_pitch);
|
||||
OUT_BATCH((box.y1 << 16) | box.x1);
|
||||
OUT_BATCH((box.y2 << 16) | box.x2);
|
||||
OUT_RELOC(dst->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE, 0);
|
||||
OUT_BATCH((box.y1 << 16) | box.x1);
|
||||
OUT_BATCH(src_pitch);
|
||||
OUT_RELOC(src->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ, 0);
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
}
|
||||
|
||||
if (intel->first_swap_fence)
|
||||
dri_fence_unreference(intel->first_swap_fence);
|
||||
intel_batchbuffer_flush(intel->batch);
|
||||
intel->first_swap_fence = intel->batch->last_fence;
|
||||
if (intel->first_swap_fence != NULL)
|
||||
if (intel->first_swap_fence)
|
||||
dri_fence_reference(intel->first_swap_fence);
|
||||
UNLOCK_HARDWARE( intel );
|
||||
}
|
||||
UNLOCK_HARDWARE(intel);
|
||||
|
||||
if (!rect)
|
||||
{
|
||||
@@ -181,7 +180,8 @@ void intelCopyBuffer( __DRIdrawablePrivate *dPriv,
|
||||
|
||||
|
||||
|
||||
void intelEmitFillBlit( struct intel_context *intel,
|
||||
void
|
||||
intelEmitFillBlit(struct intel_context *intel,
|
||||
GLuint cpp,
|
||||
GLshort dst_pitch,
|
||||
dri_bo *dst_buffer,
|
||||
@@ -189,22 +189,22 @@ void intelEmitFillBlit( struct intel_context *intel,
|
||||
GLboolean dst_tiled,
|
||||
GLshort x, GLshort y,
|
||||
GLshort w, GLshort h,
|
||||
GLuint color )
|
||||
GLuint color)
|
||||
{
|
||||
GLuint BR13, CMD;
|
||||
BATCH_LOCALS;
|
||||
|
||||
dst_pitch *= cpp;
|
||||
|
||||
switch(cpp) {
|
||||
switch (cpp) {
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
BR13 = (0xF0 << 16) | (1<<24);
|
||||
BR13 = (0xF0 << 16) | (1 << 24);
|
||||
CMD = XY_COLOR_BLT_CMD;
|
||||
break;
|
||||
case 4:
|
||||
BR13 = (0xF0 << 16) | (1<<24) | (1<<25);
|
||||
BR13 = (0xF0 << 16) | (1 << 24) | (1 << 25);
|
||||
CMD = XY_COLOR_BLT_CMD | XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;
|
||||
break;
|
||||
default:
|
||||
@@ -217,12 +217,12 @@ void intelEmitFillBlit( struct intel_context *intel,
|
||||
}
|
||||
|
||||
BEGIN_BATCH(6, INTEL_BATCH_NO_CLIPRECTS);
|
||||
OUT_BATCH( CMD );
|
||||
OUT_BATCH( dst_pitch | BR13 );
|
||||
OUT_BATCH( (y << 16) | x );
|
||||
OUT_BATCH( ((y+h) << 16) | (x+w) );
|
||||
OUT_RELOC( dst_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE, dst_offset );
|
||||
OUT_BATCH( color );
|
||||
OUT_BATCH(CMD);
|
||||
OUT_BATCH(BR13 | dst_pitch);
|
||||
OUT_BATCH((y << 16) | x);
|
||||
OUT_BATCH(((y + h) << 16) | (x + w));
|
||||
OUT_RELOC(dst_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE, dst_offset);
|
||||
OUT_BATCH(color);
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
|
||||
@@ -252,7 +252,8 @@ static GLuint translate_raster_op(GLenum logicop)
|
||||
|
||||
/* Copy BitBlt
|
||||
*/
|
||||
void intelEmitCopyBlit( struct intel_context *intel,
|
||||
void
|
||||
intelEmitCopyBlit(struct intel_context *intel,
|
||||
GLuint cpp,
|
||||
GLshort src_pitch,
|
||||
dri_bo *src_buffer,
|
||||
@@ -265,7 +266,7 @@ void intelEmitCopyBlit( struct intel_context *intel,
|
||||
GLshort src_x, GLshort src_y,
|
||||
GLshort dst_x, GLshort dst_y,
|
||||
GLshort w, GLshort h,
|
||||
GLenum logic_op )
|
||||
GLenum logic_op)
|
||||
{
|
||||
GLuint CMD, BR13;
|
||||
int dst_y2 = dst_y + h;
|
||||
@@ -273,11 +274,11 @@ void intelEmitCopyBlit( struct intel_context *intel,
|
||||
BATCH_LOCALS;
|
||||
|
||||
|
||||
DBG("%s src:buf(%d)/%d %d,%d dst:buf(%d)/%d %d,%d sz:%dx%d op:%d\n",
|
||||
DBG("%s src:buf(%d)/%d+%d %d,%d dst:buf(%d)/%d+%d %d,%d sz:%dx%d op:%d\n",
|
||||
__FUNCTION__,
|
||||
src_buffer, src_pitch, src_x, src_y,
|
||||
dst_buffer, dst_pitch, dst_x, dst_y,
|
||||
w,h,logic_op);
|
||||
src_buffer, src_pitch, src_offset, src_x, src_y,
|
||||
dst_buffer, dst_pitch, dst_offset, dst_x, dst_y,
|
||||
w, h, logic_op);
|
||||
|
||||
assert( logic_op - GL_CLEAR >= 0 );
|
||||
assert( logic_op - GL_CLEAR < 0x10 );
|
||||
@@ -285,34 +286,33 @@ void intelEmitCopyBlit( struct intel_context *intel,
|
||||
src_pitch *= cpp;
|
||||
dst_pitch *= cpp;
|
||||
|
||||
switch(cpp) {
|
||||
BR13 = translate_raster_op(logic_op) << 16;
|
||||
|
||||
switch (cpp) {
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
BR13 = (translate_raster_op(logic_op) << 16) | (1<<24);
|
||||
BR13 |= (1 << 24);
|
||||
CMD = XY_SRC_COPY_BLT_CMD;
|
||||
break;
|
||||
case 4:
|
||||
BR13 = (translate_raster_op(logic_op) << 16) | (1<<24) |
|
||||
(1<<25);
|
||||
BR13 |= (1 << 24) | (1 << 25);
|
||||
CMD = XY_SRC_COPY_BLT_CMD | XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
if (dst_tiled) {
|
||||
CMD |= XY_DST_TILED;
|
||||
dst_pitch /= 4;
|
||||
}
|
||||
if (src_tiled) {
|
||||
CMD |= XY_SRC_TILED;
|
||||
src_pitch /= 4;
|
||||
}
|
||||
|
||||
if (dst_tiled) {
|
||||
CMD |= XY_DST_TILED;
|
||||
dst_pitch /= 4;
|
||||
}
|
||||
|
||||
if (dst_y2 < dst_y ||
|
||||
dst_x2 < dst_x) {
|
||||
if (dst_y2 < dst_y || dst_x2 < dst_x) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -328,41 +328,43 @@ void intelEmitCopyBlit( struct intel_context *intel,
|
||||
*/
|
||||
if (dst_pitch > 0 && src_pitch > 0) {
|
||||
BEGIN_BATCH(8, INTEL_BATCH_NO_CLIPRECTS);
|
||||
OUT_BATCH( CMD );
|
||||
OUT_BATCH( dst_pitch | BR13 );
|
||||
OUT_BATCH( (dst_y << 16) | dst_x );
|
||||
OUT_BATCH( (dst_y2 << 16) | dst_x2 );
|
||||
OUT_RELOC( dst_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
|
||||
dst_offset );
|
||||
OUT_BATCH( (src_y << 16) | src_x );
|
||||
OUT_BATCH( src_pitch );
|
||||
OUT_RELOC( src_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
|
||||
src_offset );
|
||||
OUT_BATCH(CMD);
|
||||
OUT_BATCH(BR13 | dst_pitch);
|
||||
OUT_BATCH((dst_y << 16) | dst_x);
|
||||
OUT_BATCH((dst_y2 << 16) | dst_x2);
|
||||
OUT_RELOC(dst_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
|
||||
dst_offset);
|
||||
OUT_BATCH((src_y << 16) | src_x);
|
||||
OUT_BATCH(src_pitch);
|
||||
OUT_RELOC(src_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
|
||||
src_offset);
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
else {
|
||||
BEGIN_BATCH(8, INTEL_BATCH_NO_CLIPRECTS);
|
||||
OUT_BATCH( CMD );
|
||||
OUT_BATCH( (dst_pitch & 0xffff) | BR13 );
|
||||
OUT_BATCH( (0 << 16) | dst_x );
|
||||
OUT_BATCH( (h << 16) | dst_x2 );
|
||||
OUT_RELOC( dst_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
|
||||
dst_offset + dst_y * dst_pitch );
|
||||
OUT_BATCH( (src_pitch & 0xffff) );
|
||||
OUT_RELOC( src_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
|
||||
src_offset + src_y * src_pitch );
|
||||
OUT_BATCH(CMD);
|
||||
OUT_BATCH(BR13 | dst_pitch);
|
||||
OUT_BATCH((0 << 16) | dst_x);
|
||||
OUT_BATCH((h << 16) | dst_x2);
|
||||
OUT_RELOC(dst_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
|
||||
dst_offset + dst_y * dst_pitch);
|
||||
OUT_BATCH((0 << 16) | src_x);
|
||||
OUT_BATCH(src_pitch);
|
||||
OUT_RELOC(src_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
|
||||
src_offset + src_y * src_pitch);
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void intelClearWithBlit(GLcontext *ctx, GLbitfield flags)
|
||||
void
|
||||
intelClearWithBlit(GLcontext *ctx, GLbitfield mask)
|
||||
{
|
||||
struct intel_context *intel = intel_context( ctx );
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
struct gl_framebuffer *fb = ctx->DrawBuffer;
|
||||
intelScreenPrivate *intelScreen = intel->intelScreen;
|
||||
GLuint clear_depth, clear_color;
|
||||
GLint cx, cy, cw, ch;
|
||||
GLint cpp = intelScreen->cpp;
|
||||
GLboolean all;
|
||||
GLint i;
|
||||
@@ -375,47 +377,47 @@ void intelClearWithBlit(GLcontext *ctx, GLbitfield flags)
|
||||
GLuint depth_pitch;
|
||||
BATCH_LOCALS;
|
||||
|
||||
|
||||
clear_color = intel->ClearColor;
|
||||
clear_depth = 0;
|
||||
|
||||
if (flags & BUFFER_BIT_DEPTH) {
|
||||
if (mask & BUFFER_BIT_DEPTH) {
|
||||
clear_depth = (GLuint)(ctx->Depth.Clear * intel->ClearDepth);
|
||||
}
|
||||
|
||||
if (flags & BUFFER_BIT_STENCIL) {
|
||||
if (mask & BUFFER_BIT_STENCIL) {
|
||||
clear_depth |= (ctx->Stencil.Clear & 0xff) << 24;
|
||||
}
|
||||
|
||||
switch(cpp) {
|
||||
switch (cpp) {
|
||||
case 2:
|
||||
BR13 = (0xF0 << 16) | (1<<24);
|
||||
BR13 = (0xF0 << 16) | (1 << 24);
|
||||
BACK_CMD = FRONT_CMD = XY_COLOR_BLT_CMD;
|
||||
DEPTH_CMD = XY_COLOR_BLT_CMD;
|
||||
break;
|
||||
case 4:
|
||||
BR13 = (0xF0 << 16) | (1<<24) | (1<<25);
|
||||
BR13 = (0xF0 << 16) | (1 << 24) | (1 << 25);
|
||||
BACK_CMD = FRONT_CMD = XY_COLOR_BLT_CMD |
|
||||
XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;
|
||||
DEPTH_CMD = XY_COLOR_BLT_CMD;
|
||||
if (flags & BUFFER_BIT_DEPTH) DEPTH_CMD |= XY_BLT_WRITE_RGB;
|
||||
if (flags & BUFFER_BIT_STENCIL) DEPTH_CMD |= XY_BLT_WRITE_ALPHA;
|
||||
if (mask & BUFFER_BIT_DEPTH) DEPTH_CMD |= XY_BLT_WRITE_RGB;
|
||||
if (mask & BUFFER_BIT_STENCIL) DEPTH_CMD |= XY_BLT_WRITE_ALPHA;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
intelFlush( &intel->ctx );
|
||||
intelFlush(&intel->ctx);
|
||||
LOCK_HARDWARE( intel );
|
||||
{
|
||||
/* get clear bounds after locking */
|
||||
cx = ctx->DrawBuffer->_Xmin;
|
||||
cy = ctx->DrawBuffer->_Ymin;
|
||||
ch = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin;
|
||||
cw = ctx->DrawBuffer->_Xmax - ctx->DrawBuffer->_Xmin;
|
||||
all = (cw == ctx->DrawBuffer->Width && ch == ctx->DrawBuffer->Height);
|
||||
if (intel->numClipRects) {
|
||||
GLint cx, cy, cw, ch;
|
||||
|
||||
/* Get clear bounds after locking */
|
||||
cx = fb->_Xmin;
|
||||
cy = fb->_Ymin;
|
||||
cw = fb->_Xmax - cx;
|
||||
ch = fb->_Ymax - cy;
|
||||
all = (cw == fb->Width && ch == fb->Height);
|
||||
|
||||
/* flip top to bottom */
|
||||
cy = intel->driDrawable->h - cy - ch;
|
||||
@@ -484,45 +486,46 @@ void intelClearWithBlit(GLcontext *ctx, GLbitfield flags)
|
||||
b.y2 > intelScreen->height)
|
||||
continue;
|
||||
|
||||
if ( flags & BUFFER_BIT_FRONT_LEFT ) {
|
||||
if ( mask & BUFFER_BIT_FRONT_LEFT ) {
|
||||
BEGIN_BATCH(6, INTEL_BATCH_NO_CLIPRECTS);
|
||||
OUT_BATCH( FRONT_CMD );
|
||||
OUT_BATCH( front_pitch | BR13 );
|
||||
OUT_BATCH( (b.y1 << 16) | b.x1 );
|
||||
OUT_BATCH( (b.y2 << 16) | b.x2 );
|
||||
OUT_RELOC( front->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
|
||||
0 );
|
||||
OUT_BATCH( clear_color );
|
||||
OUT_BATCH(FRONT_CMD);
|
||||
OUT_BATCH(BR13 | front_pitch);
|
||||
OUT_BATCH((b.y1 << 16) | b.x1);
|
||||
OUT_BATCH((b.y2 << 16) | b.x2);
|
||||
OUT_RELOC(front->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
|
||||
0);
|
||||
OUT_BATCH(clear_color);
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
|
||||
if ( flags & BUFFER_BIT_BACK_LEFT ) {
|
||||
if ( mask & BUFFER_BIT_BACK_LEFT ) {
|
||||
BEGIN_BATCH(6, INTEL_BATCH_NO_CLIPRECTS);
|
||||
OUT_BATCH( BACK_CMD );
|
||||
OUT_BATCH( back_pitch | BR13 );
|
||||
OUT_BATCH( (b.y1 << 16) | b.x1 );
|
||||
OUT_BATCH( (b.y2 << 16) | b.x2 );
|
||||
OUT_RELOC( back->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
|
||||
0 );
|
||||
OUT_BATCH( clear_color );
|
||||
OUT_BATCH(BACK_CMD);
|
||||
OUT_BATCH(BR13 | back_pitch);
|
||||
OUT_BATCH((b.y1 << 16) | b.x1);
|
||||
OUT_BATCH((b.y2 << 16) | b.x2);
|
||||
OUT_RELOC(back->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
|
||||
0);
|
||||
OUT_BATCH(clear_color);
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
|
||||
if ( flags & (BUFFER_BIT_STENCIL | BUFFER_BIT_DEPTH) ) {
|
||||
if ( mask & (BUFFER_BIT_STENCIL | BUFFER_BIT_DEPTH) ) {
|
||||
BEGIN_BATCH(6, INTEL_BATCH_NO_CLIPRECTS);
|
||||
OUT_BATCH( DEPTH_CMD );
|
||||
OUT_BATCH( depth_pitch | BR13 );
|
||||
OUT_BATCH( (b.y1 << 16) | b.x1 );
|
||||
OUT_BATCH( (b.y2 << 16) | b.x2 );
|
||||
OUT_RELOC( depth->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
|
||||
0 );
|
||||
OUT_BATCH( clear_depth );
|
||||
OUT_BATCH(DEPTH_CMD);
|
||||
OUT_BATCH(BR13 | depth_pitch);
|
||||
OUT_BATCH((b.y1 << 16) | b.x1);
|
||||
OUT_BATCH((b.y2 << 16) | b.x2);
|
||||
OUT_RELOC(depth->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
|
||||
0);
|
||||
OUT_BATCH(clear_depth);
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
}
|
||||
intel_batchbuffer_flush(intel->batch);
|
||||
}
|
||||
intel_batchbuffer_flush( intel->batch );
|
||||
UNLOCK_HARDWARE( intel );
|
||||
|
||||
UNLOCK_HARDWARE(intel);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -80,18 +80,22 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
|
||||
|
||||
if (dPriv && dPriv->numClipRects) {
|
||||
struct intel_framebuffer *intel_fb = dPriv->driverPrivate;
|
||||
const struct intel_region *frontRegion
|
||||
= intel_get_rb_region(&intel_fb->Base, BUFFER_FRONT_LEFT);
|
||||
const struct intel_region *backRegion
|
||||
= intel_get_rb_region(&intel_fb->Base, BUFFER_BACK_LEFT);
|
||||
const int nbox = dPriv->numClipRects;
|
||||
const drm_clip_rect_t *pbox = dPriv->pClipRects;
|
||||
const int cpp = frontRegion->cpp;
|
||||
int src_pitch = backRegion->pitch * cpp;
|
||||
int dst_pitch = frontRegion->pitch * cpp;
|
||||
struct intel_region *src, *dst;
|
||||
int nbox = dPriv->numClipRects;
|
||||
drm_clip_rect_t *pbox = dPriv->pClipRects;
|
||||
int cpp;
|
||||
int src_pitch, dst_pitch;
|
||||
int BR13, CMD;
|
||||
int i;
|
||||
|
||||
src = intel_get_rb_region(&intel_fb->Base, BUFFER_BACK_LEFT);
|
||||
dst = intel_get_rb_region(&intel_fb->Base, BUFFER_FRONT_LEFT);
|
||||
|
||||
src_pitch = src->pitch * src->cpp;
|
||||
dst_pitch = dst->pitch * dst->cpp;
|
||||
|
||||
cpp = src->cpp;
|
||||
|
||||
ASSERT(intel_fb);
|
||||
ASSERT(intel_fb->Base.Name == 0); /* Not a user-created FBO */
|
||||
ASSERT(frontRegion);
|
||||
@@ -109,40 +113,30 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
|
||||
}
|
||||
|
||||
#ifndef I915
|
||||
if (backRegion->tiled) {
|
||||
if (src->tiled) {
|
||||
CMD |= XY_SRC_TILED;
|
||||
src_pitch /= 4;
|
||||
}
|
||||
if (frontRegion->tiled) {
|
||||
if (dst->tiled) {
|
||||
CMD |= XY_DST_TILED;
|
||||
dst_pitch /= 4;
|
||||
}
|
||||
#endif
|
||||
|
||||
for (i = 0; i < nbox; i++, pbox++) {
|
||||
drm_clip_rect_t box;
|
||||
|
||||
if (pbox->x1 >= pbox->x2 ||
|
||||
pbox->y1 >= pbox->y2 ||
|
||||
pbox->x2 > intelScreen->width || pbox->y2 > intelScreen->height)
|
||||
continue;
|
||||
|
||||
box = *pbox;
|
||||
drm_clip_rect_t box = *pbox;
|
||||
|
||||
if (rect) {
|
||||
if (rect->x1 > box.x1)
|
||||
box.x1 = rect->x1;
|
||||
if (rect->y1 > box.y1)
|
||||
box.y1 = rect->y1;
|
||||
if (rect->x2 < box.x2)
|
||||
box.x2 = rect->x2;
|
||||
if (rect->y2 < box.y2)
|
||||
box.y2 = rect->y2;
|
||||
|
||||
if (box.x1 >= box.x2 || box.y1 >= box.y2)
|
||||
if (!intel_intersect_cliprects(&box, &box, rect))
|
||||
continue;
|
||||
}
|
||||
|
||||
if (box.x1 >= box.x2 ||
|
||||
box.y1 >= box.y2 ||
|
||||
box.x2 > intelScreen->width ||
|
||||
box.y2 > intelScreen->height)
|
||||
continue;
|
||||
|
||||
assert(box.x1 < box.x2);
|
||||
assert(box.y1 < box.y2);
|
||||
|
||||
@@ -152,13 +146,10 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
|
||||
OUT_BATCH((box.y1 << 16) | box.x1);
|
||||
OUT_BATCH((box.y2 << 16) | box.x2);
|
||||
|
||||
OUT_RELOC(frontRegion->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
|
||||
0);
|
||||
OUT_RELOC(dst->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE, 0);
|
||||
OUT_BATCH((box.y1 << 16) | box.x1);
|
||||
OUT_BATCH(src_pitch);
|
||||
OUT_RELOC(backRegion->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
|
||||
0);
|
||||
|
||||
OUT_RELOC(src->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ, 0);
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
|
||||
@@ -183,7 +174,9 @@ intelEmitFillBlit(struct intel_context *intel,
|
||||
dri_bo *dst_buffer,
|
||||
GLuint dst_offset,
|
||||
GLboolean dst_tiled,
|
||||
GLshort x, GLshort y, GLshort w, GLshort h, GLuint color)
|
||||
GLshort x, GLshort y,
|
||||
GLshort w, GLshort h,
|
||||
GLuint color)
|
||||
{
|
||||
GLuint BR13, CMD;
|
||||
BATCH_LOCALS;
|
||||
@@ -227,7 +220,6 @@ intelEmitFillBlit(struct intel_context *intel,
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
|
||||
|
||||
static GLuint translate_raster_op(GLenum logicop)
|
||||
{
|
||||
switch(logicop) {
|
||||
@@ -284,7 +276,7 @@ intelEmitCopyBlit(struct intel_context *intel,
|
||||
src_pitch *= cpp;
|
||||
dst_pitch *= cpp;
|
||||
|
||||
BR13 = (translate_raster_op(logic_op) << 16);
|
||||
BR13 = translate_raster_op(logic_op) << 16;
|
||||
|
||||
switch (cpp) {
|
||||
case 1:
|
||||
@@ -316,6 +308,8 @@ intelEmitCopyBlit(struct intel_context *intel,
|
||||
return;
|
||||
}
|
||||
|
||||
dst_pitch &= 0xffff;
|
||||
src_pitch &= 0xffff;
|
||||
|
||||
/* Initial y values don't seem to work with negative pitches. If
|
||||
* we adjust the offsets manually (below), it seems to work fine.
|
||||
@@ -333,10 +327,12 @@ intelEmitCopyBlit(struct intel_context *intel,
|
||||
OUT_BATCH(BR13 | dst_pitch);
|
||||
OUT_BATCH((dst_y << 16) | dst_x);
|
||||
OUT_BATCH((dst_y2 << 16) | dst_x2);
|
||||
OUT_RELOC(dst_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE, dst_offset);
|
||||
OUT_RELOC(dst_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
|
||||
dst_offset);
|
||||
OUT_BATCH((src_y << 16) | src_x);
|
||||
OUT_BATCH(src_pitch);
|
||||
OUT_RELOC(src_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ, src_offset);
|
||||
OUT_RELOC(src_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
|
||||
src_offset);
|
||||
ADVANCE_BATCH();
|
||||
}
|
||||
else {
|
||||
@@ -367,7 +363,7 @@ intelEmitCopyBlit(struct intel_context *intel,
|
||||
* \param mask bitmask of BUFFER_BIT_* values indicating buffers to clear
|
||||
*/
|
||||
void
|
||||
intelClearWithBlit(GLcontext * ctx, GLbitfield mask)
|
||||
intelClearWithBlit(GLcontext *ctx, GLbitfield mask)
|
||||
{
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
struct gl_framebuffer *fb = ctx->DrawBuffer;
|
||||
|
Reference in New Issue
Block a user