mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-28 05:20:23 +01:00
begin getting rid of fake clip rects (copy_pixel)
This commit is contained in:
parent
a04056d313
commit
cd3afa2a95
2 changed files with 80 additions and 54 deletions
|
|
@ -192,6 +192,7 @@ const struct dri_extension card_extensions[] = {
|
|||
#if 1 /* XXX FBO temporary? */
|
||||
{"GL_EXT_packed_depth_stencil", NULL},
|
||||
#endif
|
||||
{"GL_EXT_pixel_buffer_object", NULL},
|
||||
{"GL_EXT_secondary_color", GL_EXT_secondary_color_functions},
|
||||
{"GL_EXT_stencil_wrap", NULL},
|
||||
{"GL_EXT_texture_edge_clamp", NULL},
|
||||
|
|
|
|||
|
|
@ -42,21 +42,25 @@
|
|||
#include "intel_regions.h"
|
||||
#include "intel_tris.h"
|
||||
#include "intel_pixel.h"
|
||||
#include "intel_fbo.h"
|
||||
|
||||
#define FILE_DEBUG_FLAG DEBUG_PIXEL
|
||||
|
||||
static struct intel_region *
|
||||
copypix_src_region(struct intel_context *intel, GLenum type)
|
||||
{
|
||||
struct intel_renderbuffer *irb;
|
||||
|
||||
switch (type) {
|
||||
case GL_COLOR:
|
||||
return intel_readbuf_region(intel);
|
||||
case GL_DEPTH:
|
||||
/* Don't think this is really possible execpt at 16bpp, when we have no stencil.
|
||||
*/
|
||||
if (intel->intelScreen->depth_region &&
|
||||
intel->intelScreen->depth_region->cpp == 2)
|
||||
return intel->intelScreen->depth_region;
|
||||
irb = intel_renderbuffer(intel->ctx.ReadBuffer->_DepthBuffer->Wrapped);
|
||||
if (irb && irb->region && irb->region->cpp == 2)
|
||||
return irb->region;
|
||||
break;
|
||||
case GL_STENCIL:
|
||||
/* Don't think this is really possible.
|
||||
*/
|
||||
|
|
@ -64,7 +68,10 @@ copypix_src_region(struct intel_context *intel, GLenum type)
|
|||
case GL_DEPTH_STENCIL_EXT:
|
||||
/* Does it matter whether it is stencil/depth or depth/stencil?
|
||||
*/
|
||||
return intel->intelScreen->depth_region;
|
||||
irb = intel_renderbuffer(intel->ctx.ReadBuffer->_DepthBuffer->Wrapped);
|
||||
if (irb && irb->region)
|
||||
return irb->region;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
@ -164,7 +171,8 @@ do_texture_copypixels(GLcontext * ctx,
|
|||
|
||||
/* Set the 3d engine to draw into the destination region:
|
||||
*/
|
||||
intel->vtbl.meta_draw_region(intel, dst, intel->intelScreen->depth_region);
|
||||
intel->vtbl.meta_draw_region(intel, dst,
|
||||
(intel_renderbuffer(ctx->DrawBuffer->_DepthBuffer->Wrapped))->region);
|
||||
|
||||
intel->vtbl.meta_import_pixel_state(intel);
|
||||
|
||||
|
|
@ -191,9 +199,8 @@ do_texture_copypixels(GLcontext * ctx,
|
|||
|
||||
LOCK_HARDWARE(intel);
|
||||
|
||||
if (intel->numClipRects) {
|
||||
int bufHeight = intel->pClipRects->y2;
|
||||
assert (intel->numClipRects == 1);
|
||||
{
|
||||
int bufHeight = ctx->DrawBuffer->Height;
|
||||
srcy = bufHeight - srcy - height; /* convert from gl to hardware coords */
|
||||
|
||||
/* Clip against the source region. This is the only source
|
||||
|
|
@ -205,7 +212,8 @@ do_texture_copypixels(GLcontext * ctx,
|
|||
GLint orig_x = srcx;
|
||||
GLint orig_y = srcy;
|
||||
|
||||
if (!_mesa_clip_to_region(0, 0, src->pitch, src->height,
|
||||
if (!_mesa_clip_to_region(0, 0, ctx->ReadBuffer->Width - 1,
|
||||
ctx->ReadBuffer->Height - 1,
|
||||
&srcx, &srcy, &width, &height))
|
||||
goto out;
|
||||
|
||||
|
|
@ -248,8 +256,10 @@ do_blit_copypixels(GLcontext * ctx,
|
|||
GLint dstx, GLint dsty, GLenum type)
|
||||
{
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
struct intel_region *dst = intel_drawbuf_region(intel);
|
||||
struct intel_region *src = copypix_src_region(intel, type);
|
||||
struct intel_renderbuffer *irbread;
|
||||
struct intel_renderbuffer *irbdraw;
|
||||
struct intel_region *dst;
|
||||
struct intel_region *src;
|
||||
|
||||
/* Copypixels can be more than a straight copy. Ensure all the
|
||||
* extra operations are disabled:
|
||||
|
|
@ -258,23 +268,43 @@ do_blit_copypixels(GLcontext * ctx,
|
|||
ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F)
|
||||
return GL_FALSE;
|
||||
|
||||
if (!src || !dst)
|
||||
return GL_FALSE;
|
||||
|
||||
|
||||
|
||||
intelFlush(&intel->ctx);
|
||||
|
||||
LOCK_HARDWARE(intel);
|
||||
if (type == GL_COLOR) {
|
||||
irbread = intel_renderbuffer(ctx->ReadBuffer->_ColorReadBuffer);
|
||||
irbdraw = intel_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0][0]);
|
||||
if (!irbread || !irbread->region || !irbdraw || !irbdraw->region)
|
||||
return GL_FALSE;
|
||||
}
|
||||
else if (type == GL_DEPTH) {
|
||||
/* Don't think this is really possible execpt at 16bpp, when we have no stencil.
|
||||
*/
|
||||
irbread = intel_renderbuffer(ctx->ReadBuffer->_DepthBuffer->Wrapped);
|
||||
irbdraw = intel_renderbuffer(ctx->DrawBuffer->_DepthBuffer->Wrapped);
|
||||
if (!irbread || !irbread->region || !irbdraw || !irbdraw->region
|
||||
|| !(irbread->region->cpp == 2))
|
||||
return GL_FALSE;
|
||||
}
|
||||
else if (GL_DEPTH_STENCIL_EXT) {
|
||||
/* Does it matter whether it is stencil/depth or depth/stencil?
|
||||
*/
|
||||
irbread = intel_renderbuffer(ctx->ReadBuffer->_DepthBuffer->Wrapped);
|
||||
irbdraw = intel_renderbuffer(ctx->DrawBuffer->_DepthBuffer->Wrapped);
|
||||
if (!irbread || !irbread->region || !irbdraw || !irbdraw->region)
|
||||
return GL_FALSE;
|
||||
}
|
||||
else if (GL_STENCIL) {
|
||||
/* Don't think this is really possible.
|
||||
*/
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
if (intel->numClipRects) {
|
||||
assert(intel->numClipRects == 1);
|
||||
drm_clip_rect_t *box = intel->pClipRects;
|
||||
drm_clip_rect_t dest_rect;
|
||||
GLint nbox = intel->numClipRects;
|
||||
src = irbread->region;
|
||||
dst = irbdraw->region;
|
||||
|
||||
{
|
||||
GLint delta_x = 0;
|
||||
GLint delta_y = 0;
|
||||
GLuint i;
|
||||
|
||||
/* Do scissoring in GL coordinates:
|
||||
*/
|
||||
|
|
@ -289,58 +319,54 @@ do_blit_copypixels(GLcontext * ctx,
|
|||
|
||||
if (!_mesa_clip_to_region(x, y, x+w-1, y+h-1, &dstx, &dsty, &width, &height))
|
||||
goto out;
|
||||
|
||||
|
||||
srcx = dstx - dx;
|
||||
srcy = dsty - dy;
|
||||
}
|
||||
|
||||
/* Convert from GL to hardware coordinates:
|
||||
* cliprect should be size of buffer
|
||||
*/
|
||||
dsty = box->y2 - dsty - height;
|
||||
srcy = box->y2 - srcy - height;
|
||||
dsty = irbdraw->Base.Height - dsty - height;
|
||||
srcy = irbread->Base.Height - srcy - height;
|
||||
|
||||
/* Clip against the source region. This is the only source
|
||||
* clipping we do. Dst is clipped with cliprects below.
|
||||
/* Clip against the source region:
|
||||
*/
|
||||
{
|
||||
delta_x = srcx - dstx;
|
||||
delta_y = srcy - dsty;
|
||||
|
||||
if (!_mesa_clip_to_region(0, 0, src->pitch, src->height,
|
||||
&srcx, &srcy, &width, &height))
|
||||
if (!_mesa_clip_to_region(0, 0, irbread->Base.Width - 1,
|
||||
irbread->Base.Height - 1,
|
||||
&srcx, &srcy, &width, &height))
|
||||
goto out;
|
||||
|
||||
dstx = srcx - delta_x;
|
||||
dsty = srcy - delta_y;
|
||||
}
|
||||
|
||||
dest_rect.x1 = dstx;
|
||||
dest_rect.y1 = dsty;
|
||||
dest_rect.x2 = dstx + width;
|
||||
dest_rect.y2 = dsty + height;
|
||||
|
||||
/* Could do slightly more clipping: Eg, take the intersection of
|
||||
* the existing set of cliprects and those cliprects translated
|
||||
* by delta_x, delta_y:
|
||||
*
|
||||
* This code will not overwrite other windows, but will
|
||||
* introduce garbage when copying from obscured window regions.
|
||||
/* Clip against the dest region:
|
||||
*/
|
||||
for (i = 0; i < nbox; i++) {
|
||||
drm_clip_rect_t rect;
|
||||
{
|
||||
delta_x = dstx - srcx;
|
||||
delta_y = dsty - srcy;
|
||||
|
||||
if (!intel_intersect_cliprects(&rect, &dest_rect, &box[i]))
|
||||
continue;
|
||||
if (!_mesa_clip_to_region(0, 0, irbdraw->Base.Width - 1,
|
||||
irbdraw->Base.Height - 1,
|
||||
&dstx, &dsty, &width, &height))
|
||||
goto out;
|
||||
|
||||
srcx = dstx - delta_x;
|
||||
srcy = dsty - delta_y;
|
||||
}
|
||||
|
||||
intelEmitCopyBlit(intel, dst->cpp,
|
||||
src->pitch, src->buffer, 0,
|
||||
dst->pitch, dst->buffer, 0,
|
||||
rect.x1 + delta_x,
|
||||
rect.y1 + delta_y, /* srcx, srcy */
|
||||
rect.x1, rect.y1, /* dstx, dsty */
|
||||
rect.x2 - rect.x1, rect.y2 - rect.y1,
|
||||
{
|
||||
|
||||
intelEmitCopyBlit(intel, dst->cpp,
|
||||
src->pitch, src->buffer, 0,
|
||||
dst->pitch, dst->buffer, 0,
|
||||
srcx, srcy,
|
||||
dstx, dsty,
|
||||
width, height,
|
||||
ctx->Color.ColorLogicOpEnabled ?
|
||||
ctx->Color.LogicOp : GL_COPY);
|
||||
}
|
||||
|
|
@ -348,7 +374,6 @@ do_blit_copypixels(GLcontext * ctx,
|
|||
out:
|
||||
intel_batchbuffer_flush(intel->batch);
|
||||
}
|
||||
UNLOCK_HARDWARE(intel);
|
||||
|
||||
DBG("%s: success\n", __FUNCTION__);
|
||||
return GL_TRUE;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue