gallium: Fix whole source being used in u_blit

This commit is contained in:
Jakob Bornecrantz 2008-06-24 16:06:59 +02:00
parent fd6676c249
commit 62fd280c52
1 changed files with 54 additions and 16 deletions

View File

@ -222,6 +222,49 @@ setup_vertex_data(struct blit_state *ctx,
}
/**
* Setup vertex data for the textured quad we'll draw.
* Note: y=0=top
*/
static void
setup_vertex_data_tex(struct blit_state *ctx,
float x0, float y0, float x1, float y1,
float s0, float t0, float s1, float t1,
float z)
{
void *buf;
ctx->vertices[0][0][0] = x0;
ctx->vertices[0][0][1] = y0;
ctx->vertices[0][0][2] = z;
ctx->vertices[0][1][0] = s0; /*s*/
ctx->vertices[0][1][1] = t0; /*t*/
ctx->vertices[1][0][0] = x1;
ctx->vertices[1][0][1] = y0;
ctx->vertices[1][0][2] = z;
ctx->vertices[1][1][0] = s1; /*s*/
ctx->vertices[1][1][1] = t0; /*t*/
ctx->vertices[2][0][0] = x1;
ctx->vertices[2][0][1] = y1;
ctx->vertices[2][0][2] = z;
ctx->vertices[2][1][0] = s1;
ctx->vertices[2][1][1] = t1;
ctx->vertices[3][0][0] = x0;
ctx->vertices[3][0][1] = y1;
ctx->vertices[3][0][2] = z;
ctx->vertices[3][1][0] = s0;
ctx->vertices[3][1][1] = t1;
buf = ctx->pipe->winsys->buffer_map(ctx->pipe->winsys, ctx->vbuf,
PIPE_BUFFER_USAGE_CPU_WRITE);
memcpy(buf, ctx->vertices, sizeof(ctx->vertices));
ctx->pipe->winsys->buffer_unmap(ctx->pipe->winsys, ctx->vbuf);
}
/**
* Copy pixel block from src surface to dst surface.
* Overlapping regions are acceptable.
@ -382,25 +425,18 @@ util_blit_pixels_tex(struct blit_state *ctx,
struct pipe_context *pipe = ctx->pipe;
struct pipe_screen *screen = pipe->screen;
struct pipe_framebuffer_state fb;
const int srcLeft = MIN2(srcX0, srcX1);
const int srcTop = MIN2(srcY0, srcY1);
float s0, t0, s1, t1;
assert(filter == PIPE_TEX_MIPFILTER_NEAREST ||
filter == PIPE_TEX_MIPFILTER_LINEAR);
if (srcLeft != srcX0) {
/* left-right flip */
int tmp = dstX0;
dstX0 = dstX1;
dstX1 = tmp;
}
assert(tex->width[0] != 0);
assert(tex->height[0] != 0);
if (srcTop != srcY0) {
/* up-down flip */
int tmp = dstY0;
dstY0 = dstY1;
dstY1 = tmp;
}
s0 = srcX0 / (float)tex->width[0];
s1 = srcX1 / (float)tex->width[0];
t0 = srcY0 / (float)tex->height[0];
t1 = srcY1 / (float)tex->height[0];
assert(screen->is_format_supported(screen, dst->format, PIPE_SURFACE));
@ -443,9 +479,11 @@ util_blit_pixels_tex(struct blit_state *ctx,
cso_set_framebuffer(ctx->cso, &fb);
/* draw quad */
setup_vertex_data(ctx,
setup_vertex_data_tex(ctx,
(float) dstX0, (float) dstY0,
(float) dstX1, (float) dstY1, z);
(float) dstX1, (float) dstY1,
s0, t0, s1, t1,
z);
util_draw_vertex_buffer(ctx->pipe, ctx->vbuf,
PIPE_PRIM_TRIANGLE_FAN,