blitter: refactor vertices to be more expressive

Related: https://gitlab.freedesktop.org/virgl/virglrenderer/-/issues/125

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Corentin Noël <corentin.noel@collabora.com>.
macos/master
Gert Wollny 3 years ago
parent 931c75537f
commit cba6dfe3c2
  1. 60
      src/vrend_blitter.c

@ -41,6 +41,15 @@
#define BLIT_USE_MSAA (1 << 1) #define BLIT_USE_MSAA (1 << 1)
#define BLIT_USE_DEPTH (1 << 2) #define BLIT_USE_DEPTH (1 << 2)
struct vec4 {
GLfloat x,y,z,w;
};
struct blit_coord {
struct vec4 pos;
struct vec4 tex;
};
struct vrend_blitter_ctx { struct vrend_blitter_ctx {
virgl_gl_context gl_context; virgl_gl_context gl_context;
bool initialised; bool initialised;
@ -64,7 +73,7 @@ struct vrend_blitter_ctx {
unsigned dst_height; unsigned dst_height;
GLuint vbo_id; GLuint vbo_id;
GLfloat vertices[4][2][4]; /**< {pos, color} or {pos, texcoord} */ struct blit_coord vertices[4];
}; };
static struct vrend_blitter_ctx vrend_blit_ctx; static struct vrend_blitter_ctx vrend_blit_ctx;
@ -388,8 +397,11 @@ static void vrend_renderer_init_blit_ctx(struct vrend_blitter_ctx *blit_ctx)
blit_ctx->vs = blit_shader_build_and_check(GL_VERTEX_SHADER, blit_ctx->vs = blit_shader_build_and_check(GL_VERTEX_SHADER,
blit_ctx->use_gles ? VS_PASSTHROUGH_GLES : VS_PASSTHROUGH_GL); blit_ctx->use_gles ? VS_PASSTHROUGH_GLES : VS_PASSTHROUGH_GL);
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++) {
blit_ctx->vertices[i][0][3] = 1; /*v.w*/ blit_ctx->vertices[i].pos.z = 0;
blit_ctx->vertices[i].pos.w = 1;
}
glBindVertexArray(blit_ctx->vaoid); glBindVertexArray(blit_ctx->vaoid);
glBindBuffer(GL_ARRAY_BUFFER, blit_ctx->vbo_id); glBindBuffer(GL_ARRAY_BUFFER, blit_ctx->vbo_id);
@ -398,26 +410,20 @@ static void vrend_renderer_init_blit_ctx(struct vrend_blitter_ctx *blit_ctx)
} }
static void blitter_set_rectangle(struct vrend_blitter_ctx *blit_ctx, static void blitter_set_rectangle(struct vrend_blitter_ctx *blit_ctx,
int x1, int y1, int x2, int y2, int x1, int y1, int x2, int y2)
float depth)
{ {
int i;
/* set vertex positions */ /* set vertex positions */
blit_ctx->vertices[0][0][0] = (float)x1 / blit_ctx->dst_width * 2.0f - 1.0f; /*v0.x*/ blit_ctx->vertices[0].pos.x = (float)x1 / blit_ctx->dst_width * 2.0f - 1.0f; /*v0.x*/
blit_ctx->vertices[0][0][1] = (float)y1 / blit_ctx->dst_height * 2.0f - 1.0f; /*v0.y*/ blit_ctx->vertices[0].pos.y = (float)y1 / blit_ctx->dst_height * 2.0f - 1.0f; /*v0.y*/
blit_ctx->vertices[1][0][0] = (float)x2 / blit_ctx->dst_width * 2.0f - 1.0f; /*v1.x*/
blit_ctx->vertices[1][0][1] = (float)y1 / blit_ctx->dst_height * 2.0f - 1.0f; /*v1.y*/
blit_ctx->vertices[2][0][0] = (float)x2 / blit_ctx->dst_width * 2.0f - 1.0f; /*v2.x*/ blit_ctx->vertices[1].pos.x = (float)x2 / blit_ctx->dst_width * 2.0f - 1.0f; /*v1.x*/
blit_ctx->vertices[2][0][1] = (float)y2 / blit_ctx->dst_height * 2.0f - 1.0f; /*v2.y*/ blit_ctx->vertices[1].pos.y = (float)y1 / blit_ctx->dst_height * 2.0f - 1.0f; /*v1.y*/
blit_ctx->vertices[3][0][0] = (float)x1 / blit_ctx->dst_width * 2.0f - 1.0f; /*v3.x*/ blit_ctx->vertices[2].pos.x = (float)x2 / blit_ctx->dst_width * 2.0f - 1.0f; /*v2.x*/
blit_ctx->vertices[3][0][1] = (float)y2 / blit_ctx->dst_height * 2.0f - 1.0f; /*v3.y*/ blit_ctx->vertices[2].pos.y = (float)y2 / blit_ctx->dst_height * 2.0f - 1.0f; /*v2.y*/
for (i = 0; i < 4; i++) blit_ctx->vertices[3].pos.x = (float)x1 / blit_ctx->dst_width * 2.0f - 1.0f; /*v3.x*/
blit_ctx->vertices[i][0][2] = depth; /*z*/ blit_ctx->vertices[3].pos.y = (float)y2 / blit_ctx->dst_height * 2.0f - 1.0f; /*v3.y*/
glViewport(0, 0, blit_ctx->dst_width, blit_ctx->dst_height); glViewport(0, 0, blit_ctx->dst_width, blit_ctx->dst_height);
} }
@ -477,10 +483,10 @@ static void blitter_set_texcoords(struct vrend_blitter_ctx *blit_ctx,
util_map_texcoords2d_onto_cubemap((unsigned)layer % 6, util_map_texcoords2d_onto_cubemap((unsigned)layer % 6,
/* pointer, stride in floats */ /* pointer, stride in floats */
&face_coord[0][0], 2, &face_coord[0][0], 2,
&blit_ctx->vertices[0][1][0], 8, &blit_ctx->vertices[0].tex.x, 8,
FALSE); FALSE);
} else { } else {
set_texcoords_in_vertices(coord, &blit_ctx->vertices[0][1][0], 8); set_texcoords_in_vertices(coord, &blit_ctx->vertices[0].tex.x, 8);
} }
switch (src_res->base.target) { switch (src_res->base.target) {
@ -489,28 +495,28 @@ static void blitter_set_texcoords(struct vrend_blitter_ctx *blit_ctx,
float r = layer / (float)u_minify(src_res->base.depth0, float r = layer / (float)u_minify(src_res->base.depth0,
level); level);
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
blit_ctx->vertices[i][1][2] = r; /*r*/ blit_ctx->vertices[i].tex.z = r; /*r*/
} }
break; break;
case PIPE_TEXTURE_1D_ARRAY: case PIPE_TEXTURE_1D_ARRAY:
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
blit_ctx->vertices[i][1][1] = (float) layer; /*t*/ blit_ctx->vertices[i].tex.y = (float) layer; /*t*/
break; break;
case PIPE_TEXTURE_2D_ARRAY: case PIPE_TEXTURE_2D_ARRAY:
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
blit_ctx->vertices[i][1][2] = (float) layer; /*r*/ blit_ctx->vertices[i].tex.z = (float) layer; /*r*/
blit_ctx->vertices[i][1][3] = (float) sample; /*q*/ blit_ctx->vertices[i].tex.w = (float) sample; /*q*/
} }
break; break;
case PIPE_TEXTURE_CUBE_ARRAY: case PIPE_TEXTURE_CUBE_ARRAY:
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
blit_ctx->vertices[i][1][3] = (float) ((unsigned)layer / 6); /*w*/ blit_ctx->vertices[i].tex.w = (float) ((unsigned)layer / 6); /*w*/
break; break;
case PIPE_TEXTURE_2D: case PIPE_TEXTURE_2D:
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
blit_ctx->vertices[i][1][3] = (float) sample; /*r*/ blit_ctx->vertices[i].tex.w = (float) sample; /*r*/
} }
break; break;
default:; default:;
@ -636,7 +642,7 @@ static void blitter_set_points(struct vrend_blitter_ctx *blit_ctx,
src0->x, src0->y, src1->x, src1->y, src0->x, src0->y, src1->x, src1->y,
dst0.x, dst0.y, dst1.x, dst1.y); dst0.x, dst0.y, dst1.x, dst1.y);
blitter_set_rectangle(blit_ctx, dst0.x, dst0.y, dst1.x, dst1.y, 0); blitter_set_rectangle(blit_ctx, dst0.x, dst0.y, dst1.x, dst1.y);
} }
static void vrend_set_tex_param(struct vrend_resource *src_res, static void vrend_set_tex_param(struct vrend_resource *src_res,

Loading…
Cancel
Save