mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-07 03:20:28 +01:00
Merge branch '7.8'
Conflicts: src/mesa/state_tracker/st_cb_drawpixels.c
This commit is contained in:
commit
ef92fe85de
3 changed files with 37 additions and 137 deletions
|
|
@ -303,7 +303,7 @@ _mesa_clip_drawpixels(const GLcontext *ctx,
|
|||
|
||||
extern GLboolean
|
||||
_mesa_clip_readpixels(const GLcontext *ctx,
|
||||
GLint *destX, GLint *destY,
|
||||
GLint *srcX, GLint *srcY,
|
||||
GLsizei *width, GLsizei *height,
|
||||
struct gl_pixelstore_attrib *pack);
|
||||
|
||||
|
|
|
|||
|
|
@ -968,39 +968,13 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,
|
|||
GLfloat *color;
|
||||
enum pipe_format srcFormat, texFormat;
|
||||
GLboolean invertTex = GL_FALSE;
|
||||
GLint readX, readY, readW, readH;
|
||||
struct gl_pixelstore_attrib unpack = ctx->DefaultPacking;
|
||||
|
||||
pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, NULL);
|
||||
|
||||
st_validate_state(st);
|
||||
|
||||
if (srcx < 0) {
|
||||
width -= -srcx;
|
||||
dstx += -srcx;
|
||||
srcx = 0;
|
||||
}
|
||||
|
||||
if (srcy < 0) {
|
||||
height -= -srcy;
|
||||
dsty += -srcy;
|
||||
srcy = 0;
|
||||
}
|
||||
|
||||
if (dstx < 0) {
|
||||
width -= -dstx;
|
||||
srcx += -dstx;
|
||||
dstx = 0;
|
||||
}
|
||||
|
||||
if (dsty < 0) {
|
||||
height -= -dsty;
|
||||
srcy += -dsty;
|
||||
dsty = 0;
|
||||
}
|
||||
|
||||
if (width < 0 || height < 0)
|
||||
return;
|
||||
|
||||
|
||||
if (type == GL_STENCIL) {
|
||||
/* can't use texturing to do stencil */
|
||||
copy_stencil_pixels(ctx, srcx, srcy, width, height, dstx, dsty);
|
||||
|
|
@ -1033,7 +1007,7 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,
|
|||
texFormat = st_choose_format(screen, GL_DEPTH_COMPONENT,
|
||||
PIPE_TEXTURE_2D,
|
||||
PIPE_TEXTURE_USAGE_DEPTH_STENCIL);
|
||||
assert(texFormat != PIPE_FORMAT_NONE); /* XXX no depth texture formats??? */
|
||||
assert(texFormat != PIPE_FORMAT_NONE);
|
||||
}
|
||||
else {
|
||||
/* default color format */
|
||||
|
|
@ -1043,20 +1017,26 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,
|
|||
}
|
||||
}
|
||||
|
||||
/* Invert src region if needed */
|
||||
if (st_fb_orientation(ctx->ReadBuffer) == Y_0_TOP) {
|
||||
srcy = ctx->ReadBuffer->Height - srcy - height;
|
||||
|
||||
if (srcy < 0) {
|
||||
height -= -srcy;
|
||||
srcy = 0;
|
||||
}
|
||||
|
||||
if (height < 0)
|
||||
return;
|
||||
|
||||
invertTex = !invertTex;
|
||||
}
|
||||
|
||||
/* Clip the read region against the src buffer bounds.
|
||||
* We'll still allocate a temporary buffer/texture for the original
|
||||
* src region size but we'll only read the region which is on-screen.
|
||||
* This may mean that we draw garbage pixels into the dest region, but
|
||||
* that's expected.
|
||||
*/
|
||||
readX = srcx;
|
||||
readY = srcy;
|
||||
readW = width;
|
||||
readH = height;
|
||||
_mesa_clip_readpixels(ctx, &readX, &readY, &readW, &readH, &unpack);
|
||||
readW = MAX2(0, readW);
|
||||
readH = MAX2(0, readH);
|
||||
|
||||
/* alloc temporary texture */
|
||||
pt = alloc_texture(st, width, height, texFormat);
|
||||
if (!pt)
|
||||
|
|
@ -1069,7 +1049,6 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,
|
|||
}
|
||||
|
||||
/* Make temporary texture which is a copy of the src region.
|
||||
* We'll draw a quad with this texture to draw the dest image.
|
||||
*/
|
||||
if (srcFormat == texFormat) {
|
||||
/* copy source framebuffer surface into mipmap/texture */
|
||||
|
|
@ -1080,16 +1059,16 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,
|
|||
PIPE_BUFFER_USAGE_GPU_WRITE );
|
||||
if (pipe->surface_copy) {
|
||||
pipe->surface_copy(pipe,
|
||||
psTex, /* dest */
|
||||
0, 0, /* destx/y */
|
||||
psRead,
|
||||
srcx, srcy, width, height);
|
||||
psTex, /* dest surf */
|
||||
unpack.SkipPixels, unpack.SkipRows, /* dest pos */
|
||||
psRead, /* src surf */
|
||||
readX, readY, readW, readH); /* src region */
|
||||
} else {
|
||||
util_surface_copy(pipe, FALSE,
|
||||
psTex,
|
||||
0, 0,
|
||||
unpack.SkipPixels, unpack.SkipRows,
|
||||
psRead,
|
||||
srcx, srcy, width, height);
|
||||
readX, readY, readW, readH);
|
||||
}
|
||||
|
||||
if (0) {
|
||||
|
|
@ -1105,8 +1084,8 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,
|
|||
/* CPU-based fallback/conversion */
|
||||
struct pipe_transfer *ptRead =
|
||||
st_cond_flush_get_tex_transfer(st, rbRead->texture, 0, 0, 0,
|
||||
PIPE_TRANSFER_READ, srcx, srcy, width,
|
||||
height);
|
||||
PIPE_TRANSFER_READ,
|
||||
readX, readY, readW, readH);
|
||||
struct pipe_transfer *ptTex;
|
||||
enum pipe_transfer_usage transfer_usage;
|
||||
|
||||
|
|
@ -1121,20 +1100,21 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,
|
|||
ptTex = st_cond_flush_get_tex_transfer(st, pt, 0, 0, 0, transfer_usage,
|
||||
0, 0, width, height);
|
||||
|
||||
/* copy image from ptRead surface to ptTex surface */
|
||||
if (type == GL_COLOR) {
|
||||
/* alternate path using get/put_tile() */
|
||||
GLfloat *buf = (GLfloat *) malloc(width * height * 4 * sizeof(GLfloat));
|
||||
|
||||
pipe_get_tile_rgba(pipe, ptRead, 0, 0, width, height, buf);
|
||||
pipe_put_tile_rgba(pipe, ptTex, 0, 0, width, height, buf);
|
||||
|
||||
pipe_get_tile_rgba(pipe, ptRead, readX, readY, readW, readH, buf);
|
||||
pipe_put_tile_rgba(pipe, ptTex, unpack.SkipPixels, unpack.SkipRows,
|
||||
readW, readH, buf);
|
||||
free(buf);
|
||||
}
|
||||
else {
|
||||
/* GL_DEPTH */
|
||||
GLuint *buf = (GLuint *) malloc(width * height * sizeof(GLuint));
|
||||
pipe_get_tile_z(pipe, ptRead, 0, 0, width, height, buf);
|
||||
pipe_put_tile_z(pipe, ptTex, 0, 0, width, height, buf);
|
||||
pipe_get_tile_z(pipe, ptRead, readX, readY, readW, readH, buf);
|
||||
pipe_put_tile_z(pipe, ptTex, unpack.SkipPixels, unpack.SkipRows,
|
||||
readW, readH, buf);
|
||||
free(buf);
|
||||
}
|
||||
|
||||
|
|
@ -1142,7 +1122,9 @@ st_CopyPixels(GLcontext *ctx, GLint srcx, GLint srcy,
|
|||
pipe->tex_transfer_destroy(pipe, ptTex);
|
||||
}
|
||||
|
||||
/* draw textured quad */
|
||||
/* OK, the texture 'pt' contains the src image/pixels. Now draw a
|
||||
* textured quad with that texture.
|
||||
*/
|
||||
draw_textured_quad(ctx, dstx, dsty, ctx->Current.RasterPos[2],
|
||||
width, height, ctx->Pixel.ZoomX, ctx->Pixel.ZoomY,
|
||||
sv,
|
||||
|
|
|
|||
|
|
@ -268,88 +268,6 @@ compute_coveragef(const GLfloat v0[3], const GLfloat v1[3],
|
|||
|
||||
|
||||
|
||||
/*
|
||||
* Compute how much (area) of the given pixel is inside the triangle.
|
||||
* Vertices MUST be specified in counter-clockwise order.
|
||||
* Return: coverage in [0, 15].
|
||||
*/
|
||||
static GLint
|
||||
compute_coveragei(const GLfloat v0[3], const GLfloat v1[3],
|
||||
const GLfloat v2[3], GLint winx, GLint winy)
|
||||
{
|
||||
/* NOTE: 15 samples instead of 16. */
|
||||
static const GLfloat samples[15][2] = {
|
||||
/* start with the four corners */
|
||||
{ POS(0, 2), POS(0, 0) },
|
||||
{ POS(3, 3), POS(0, 2) },
|
||||
{ POS(0, 0), POS(3, 1) },
|
||||
{ POS(3, 1), POS(3, 3) },
|
||||
/* continue with interior samples */
|
||||
{ POS(1, 1), POS(0, 1) },
|
||||
{ POS(2, 0), POS(0, 3) },
|
||||
{ POS(0, 3), POS(1, 3) },
|
||||
{ POS(1, 2), POS(1, 0) },
|
||||
{ POS(2, 3), POS(1, 2) },
|
||||
{ POS(3, 2), POS(1, 1) },
|
||||
{ POS(0, 1), POS(2, 2) },
|
||||
{ POS(1, 0), POS(2, 1) },
|
||||
{ POS(2, 1), POS(2, 3) },
|
||||
{ POS(3, 0), POS(2, 0) },
|
||||
{ POS(1, 3), POS(3, 0) }
|
||||
};
|
||||
const GLfloat x = (GLfloat) winx;
|
||||
const GLfloat y = (GLfloat) winy;
|
||||
const GLfloat dx0 = v1[0] - v0[0];
|
||||
const GLfloat dy0 = v1[1] - v0[1];
|
||||
const GLfloat dx1 = v2[0] - v1[0];
|
||||
const GLfloat dy1 = v2[1] - v1[1];
|
||||
const GLfloat dx2 = v0[0] - v2[0];
|
||||
const GLfloat dy2 = v0[1] - v2[1];
|
||||
GLint stop = 4, i;
|
||||
GLint insideCount = 15;
|
||||
|
||||
#ifdef DEBUG
|
||||
{
|
||||
const GLfloat area = dx0 * dy1 - dx1 * dy0;
|
||||
ASSERT(area >= 0.0);
|
||||
}
|
||||
#endif
|
||||
|
||||
for (i = 0; i < stop; i++) {
|
||||
const GLfloat sx = x + samples[i][0];
|
||||
const GLfloat sy = y + samples[i][1];
|
||||
const GLfloat fx0 = sx - v0[0];
|
||||
const GLfloat fy0 = sy - v0[1];
|
||||
const GLfloat fx1 = sx - v1[0];
|
||||
const GLfloat fy1 = sy - v1[1];
|
||||
const GLfloat fx2 = sx - v2[0];
|
||||
const GLfloat fy2 = sy - v2[1];
|
||||
/* cross product determines if sample is inside or outside each edge */
|
||||
GLfloat cross0 = (dx0 * fy0 - dy0 * fx0);
|
||||
GLfloat cross1 = (dx1 * fy1 - dy1 * fx1);
|
||||
GLfloat cross2 = (dx2 * fy2 - dy2 * fx2);
|
||||
/* Check if the sample is exactly on an edge. If so, let cross be a
|
||||
* positive or negative value depending on the direction of the edge.
|
||||
*/
|
||||
if (cross0 == 0.0F)
|
||||
cross0 = dx0 + dy0;
|
||||
if (cross1 == 0.0F)
|
||||
cross1 = dx1 + dy1;
|
||||
if (cross2 == 0.0F)
|
||||
cross2 = dx2 + dy2;
|
||||
if (cross0 < 0.0F || cross1 < 0.0F || cross2 < 0.0F) {
|
||||
/* point is outside triangle */
|
||||
insideCount--;
|
||||
stop = 15;
|
||||
}
|
||||
}
|
||||
if (stop == 4)
|
||||
return 15;
|
||||
else
|
||||
return insideCount;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
rgba_aa_tri(GLcontext *ctx,
|
||||
const SWvertex *v0,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue