gallium: Fix whole source being used in u_blit
This commit is contained in:
parent
fd6676c249
commit
62fd280c52
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue