/** * Setup vertex data for the textured quad we'll draw. * Note: y=0=top * * FIXME: We should call util_map_texcoords2d_onto_cubemap * for cubemaps. */ static unsigned setup_vertex_data_tex(struct blit_state *ctx, enum pipe_texture_target src_target, unsigned src_face, float x0, float y0, float x1, float y1, float s0, float t0, float s1, float t1, float z) { unsigned offset; 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[0][1][2] = 0; /*r*/ 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[1][1][2] = 0; /*r*/ 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][1][2] = 0; 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; ctx->vertices[3][1][2] = 0; if (src_target == PIPE_TEXTURE_CUBE || src_target == PIPE_TEXTURE_CUBE_ARRAY) { /* Map cubemap texture coordinates inplace. */ const unsigned stride = sizeof ctx->vertices[0] / sizeof ctx->vertices[0][0][0]; util_map_texcoords2d_onto_cubemap(src_face, &ctx->vertices[0][1][0], stride, &ctx->vertices[0][1][0], stride, TRUE); } offset = get_next_slot(ctx); if (ctx->vbuf) { pipe_buffer_write_nooverlap(ctx->pipe, ctx->vbuf, offset, sizeof(ctx->vertices), ctx->vertices); } return offset; }
/** * Setup vertex data for the textured quad we'll draw. * Note: y=0=top */ static unsigned 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) { unsigned offset; 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; offset = get_next_slot( ctx ); if (ctx->vbuf) { pipe_buffer_write_nooverlap(ctx->pipe, ctx->vbuf, offset, sizeof(ctx->vertices), ctx->vertices); } return offset; }
static unsigned set_vertex_data(struct gen_mipmap_state *ctx, enum pipe_texture_target tex_target, uint face, float r) { unsigned offset; /* vert[0].position */ ctx->vertices[0][0][0] = -1.0f; /*x*/ ctx->vertices[0][0][1] = -1.0f; /*y*/ /* vert[1].position */ ctx->vertices[1][0][0] = 1.0f; ctx->vertices[1][0][1] = -1.0f; /* vert[2].position */ ctx->vertices[2][0][0] = 1.0f; ctx->vertices[2][0][1] = 1.0f; /* vert[3].position */ ctx->vertices[3][0][0] = -1.0f; ctx->vertices[3][0][1] = 1.0f; /* Setup vertex texcoords. This is a little tricky for cube maps. */ if (tex_target == PIPE_TEXTURE_CUBE || tex_target == PIPE_TEXTURE_CUBE_ARRAY) { static const float st[4][2] = { {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f} }; util_map_texcoords2d_onto_cubemap(face, &st[0][0], 2, &ctx->vertices[0][1][0], 8, FALSE); /* set the layer for cube arrays */ ctx->vertices[0][1][3] = r; ctx->vertices[1][1][3] = r; ctx->vertices[2][1][3] = r; ctx->vertices[3][1][3] = r; } else if (tex_target == PIPE_TEXTURE_1D_ARRAY) { /* 1D texture array */ ctx->vertices[0][1][0] = 0.0f; /*s*/ ctx->vertices[0][1][1] = r; /*t*/ ctx->vertices[0][1][2] = 0.0f; /*r*/ ctx->vertices[1][1][0] = 1.0f; ctx->vertices[1][1][1] = r; ctx->vertices[1][1][2] = 0.0f; ctx->vertices[2][1][0] = 1.0f; ctx->vertices[2][1][1] = r; ctx->vertices[2][1][2] = 0.0f; ctx->vertices[3][1][0] = 0.0f; ctx->vertices[3][1][1] = r; ctx->vertices[3][1][2] = 0.0f; } else { /* 1D/2D/3D/2D array */ ctx->vertices[0][1][0] = 0.0f; /*s*/ ctx->vertices[0][1][1] = 0.0f; /*t*/ ctx->vertices[0][1][2] = r; /*r*/ ctx->vertices[1][1][0] = 1.0f; ctx->vertices[1][1][1] = 0.0f; ctx->vertices[1][1][2] = r; ctx->vertices[2][1][0] = 1.0f; ctx->vertices[2][1][1] = 1.0f; ctx->vertices[2][1][2] = r; ctx->vertices[3][1][0] = 0.0f; ctx->vertices[3][1][1] = 1.0f; ctx->vertices[3][1][2] = r; } offset = get_next_slot( ctx ); pipe_buffer_write_nooverlap(ctx->pipe, ctx->vbuf, offset, sizeof(ctx->vertices), ctx->vertices); return offset; }