wined3d: Store blit quad texture coordinates in a struct wined3d_vec3 array.

Signed-off-by: Matteo Bruni <mbruni@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Matteo Bruni 2016-10-14 00:03:37 +02:00 committed by Alexandre Julliard
parent b29e3b4ffa
commit 4382f9235b
1 changed files with 51 additions and 51 deletions

View File

@ -74,7 +74,7 @@ struct blt_info
GLenum binding;
GLenum bind_target;
enum wined3d_gl_resource_type tex_type;
GLfloat coords[4][3];
struct wined3d_vec3 texcoords[4];
};
struct float_rect
@ -95,43 +95,43 @@ static inline void cube_coords_float(const RECT *r, UINT w, UINT h, struct float
static void surface_get_blt_info(GLenum target, const RECT *rect, GLsizei w, GLsizei h, struct blt_info *info)
{
GLfloat (*coords)[3] = info->coords;
struct wined3d_vec3 *coords = info->texcoords;
struct float_rect f;
switch (target)
{
default:
FIXME("Unsupported texture target %#x\n", target);
FIXME("Unsupported texture target %#x.\n", target);
/* Fall back to GL_TEXTURE_2D */
case GL_TEXTURE_2D:
info->binding = GL_TEXTURE_BINDING_2D;
info->bind_target = GL_TEXTURE_2D;
info->tex_type = WINED3D_GL_RES_TYPE_TEX_2D;
coords[0][0] = (float)rect->left / w;
coords[0][1] = (float)rect->top / h;
coords[0][2] = 0.0f;
coords[0].x = (float)rect->left / w;
coords[0].y = (float)rect->top / h;
coords[0].z = 0.0f;
coords[1][0] = (float)rect->right / w;
coords[1][1] = (float)rect->top / h;
coords[1][2] = 0.0f;
coords[1].x = (float)rect->right / w;
coords[1].y = (float)rect->top / h;
coords[1].z = 0.0f;
coords[2][0] = (float)rect->left / w;
coords[2][1] = (float)rect->bottom / h;
coords[2][2] = 0.0f;
coords[2].x = (float)rect->left / w;
coords[2].y = (float)rect->bottom / h;
coords[2].z = 0.0f;
coords[3][0] = (float)rect->right / w;
coords[3][1] = (float)rect->bottom / h;
coords[3][2] = 0.0f;
coords[3].x = (float)rect->right / w;
coords[3].y = (float)rect->bottom / h;
coords[3].z = 0.0f;
break;
case GL_TEXTURE_RECTANGLE_ARB:
info->binding = GL_TEXTURE_BINDING_RECTANGLE_ARB;
info->bind_target = GL_TEXTURE_RECTANGLE_ARB;
info->tex_type = WINED3D_GL_RES_TYPE_TEX_RECT;
coords[0][0] = rect->left; coords[0][1] = rect->top; coords[0][2] = 0.0f;
coords[1][0] = rect->right; coords[1][1] = rect->top; coords[1][2] = 0.0f;
coords[2][0] = rect->left; coords[2][1] = rect->bottom; coords[2][2] = 0.0f;
coords[3][0] = rect->right; coords[3][1] = rect->bottom; coords[3][2] = 0.0f;
coords[0].x = rect->left; coords[0].y = rect->top; coords[0].z = 0.0f;
coords[1].x = rect->right; coords[1].y = rect->top; coords[1].z = 0.0f;
coords[2].x = rect->left; coords[2].y = rect->bottom; coords[2].z = 0.0f;
coords[3].x = rect->right; coords[3].y = rect->bottom; coords[3].z = 0.0f;
break;
case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
@ -140,10 +140,10 @@ static void surface_get_blt_info(GLenum target, const RECT *rect, GLsizei w, GLs
info->tex_type = WINED3D_GL_RES_TYPE_TEX_CUBE;
cube_coords_float(rect, w, h, &f);
coords[0][0] = 1.0f; coords[0][1] = -f.t; coords[0][2] = -f.l;
coords[1][0] = 1.0f; coords[1][1] = -f.t; coords[1][2] = -f.r;
coords[2][0] = 1.0f; coords[2][1] = -f.b; coords[2][2] = -f.l;
coords[3][0] = 1.0f; coords[3][1] = -f.b; coords[3][2] = -f.r;
coords[0].x = 1.0f; coords[0].y = -f.t; coords[0].z = -f.l;
coords[1].x = 1.0f; coords[1].y = -f.t; coords[1].z = -f.r;
coords[2].x = 1.0f; coords[2].y = -f.b; coords[2].z = -f.l;
coords[3].x = 1.0f; coords[3].y = -f.b; coords[3].z = -f.r;
break;
case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
@ -152,10 +152,10 @@ static void surface_get_blt_info(GLenum target, const RECT *rect, GLsizei w, GLs
info->tex_type = WINED3D_GL_RES_TYPE_TEX_CUBE;
cube_coords_float(rect, w, h, &f);
coords[0][0] = -1.0f; coords[0][1] = -f.t; coords[0][2] = f.l;
coords[1][0] = -1.0f; coords[1][1] = -f.t; coords[1][2] = f.r;
coords[2][0] = -1.0f; coords[2][1] = -f.b; coords[2][2] = f.l;
coords[3][0] = -1.0f; coords[3][1] = -f.b; coords[3][2] = f.r;
coords[0].x = -1.0f; coords[0].y = -f.t; coords[0].z = f.l;
coords[1].x = -1.0f; coords[1].y = -f.t; coords[1].z = f.r;
coords[2].x = -1.0f; coords[2].y = -f.b; coords[2].z = f.l;
coords[3].x = -1.0f; coords[3].y = -f.b; coords[3].z = f.r;
break;
case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
@ -164,10 +164,10 @@ static void surface_get_blt_info(GLenum target, const RECT *rect, GLsizei w, GLs
info->tex_type = WINED3D_GL_RES_TYPE_TEX_CUBE;
cube_coords_float(rect, w, h, &f);
coords[0][0] = f.l; coords[0][1] = 1.0f; coords[0][2] = f.t;
coords[1][0] = f.r; coords[1][1] = 1.0f; coords[1][2] = f.t;
coords[2][0] = f.l; coords[2][1] = 1.0f; coords[2][2] = f.b;
coords[3][0] = f.r; coords[3][1] = 1.0f; coords[3][2] = f.b;
coords[0].x = f.l; coords[0].y = 1.0f; coords[0].z = f.t;
coords[1].x = f.r; coords[1].y = 1.0f; coords[1].z = f.t;
coords[2].x = f.l; coords[2].y = 1.0f; coords[2].z = f.b;
coords[3].x = f.r; coords[3].y = 1.0f; coords[3].z = f.b;
break;
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
@ -176,10 +176,10 @@ static void surface_get_blt_info(GLenum target, const RECT *rect, GLsizei w, GLs
info->tex_type = WINED3D_GL_RES_TYPE_TEX_CUBE;
cube_coords_float(rect, w, h, &f);
coords[0][0] = f.l; coords[0][1] = -1.0f; coords[0][2] = -f.t;
coords[1][0] = f.r; coords[1][1] = -1.0f; coords[1][2] = -f.t;
coords[2][0] = f.l; coords[2][1] = -1.0f; coords[2][2] = -f.b;
coords[3][0] = f.r; coords[3][1] = -1.0f; coords[3][2] = -f.b;
coords[0].x = f.l; coords[0].y = -1.0f; coords[0].z = -f.t;
coords[1].x = f.r; coords[1].y = -1.0f; coords[1].z = -f.t;
coords[2].x = f.l; coords[2].y = -1.0f; coords[2].z = -f.b;
coords[3].x = f.r; coords[3].y = -1.0f; coords[3].z = -f.b;
break;
case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
@ -188,10 +188,10 @@ static void surface_get_blt_info(GLenum target, const RECT *rect, GLsizei w, GLs
info->tex_type = WINED3D_GL_RES_TYPE_TEX_CUBE;
cube_coords_float(rect, w, h, &f);
coords[0][0] = f.l; coords[0][1] = -f.t; coords[0][2] = 1.0f;
coords[1][0] = f.r; coords[1][1] = -f.t; coords[1][2] = 1.0f;
coords[2][0] = f.l; coords[2][1] = -f.b; coords[2][2] = 1.0f;
coords[3][0] = f.r; coords[3][1] = -f.b; coords[3][2] = 1.0f;
coords[0].x = f.l; coords[0].y = -f.t; coords[0].z = 1.0f;
coords[1].x = f.r; coords[1].y = -f.t; coords[1].z = 1.0f;
coords[2].x = f.l; coords[2].y = -f.b; coords[2].z = 1.0f;
coords[3].x = f.r; coords[3].y = -f.b; coords[3].z = 1.0f;
break;
case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
@ -200,10 +200,10 @@ static void surface_get_blt_info(GLenum target, const RECT *rect, GLsizei w, GLs
info->tex_type = WINED3D_GL_RES_TYPE_TEX_CUBE;
cube_coords_float(rect, w, h, &f);
coords[0][0] = -f.l; coords[0][1] = -f.t; coords[0][2] = -1.0f;
coords[1][0] = -f.r; coords[1][1] = -f.t; coords[1][2] = -1.0f;
coords[2][0] = -f.l; coords[2][1] = -f.b; coords[2][2] = -1.0f;
coords[3][0] = -f.r; coords[3][1] = -f.b; coords[3][2] = -1.0f;
coords[0].x = -f.l; coords[0].y = -f.t; coords[0].z = -1.0f;
coords[1].x = -f.r; coords[1].y = -f.t; coords[1].z = -1.0f;
coords[2].x = -f.l; coords[2].y = -f.b; coords[2].z = -1.0f;
coords[3].x = -f.r; coords[3].y = -f.b; coords[3].z = -1.0f;
break;
}
}
@ -253,16 +253,16 @@ void draw_textured_quad(const struct wined3d_surface *src_surface, struct wined3
/* Draw a quad */
gl_info->gl_ops.gl.p_glBegin(GL_TRIANGLE_STRIP);
gl_info->gl_ops.gl.p_glTexCoord3fv(info.coords[0]);
gl_info->gl_ops.gl.p_glTexCoord3fv(&info.texcoords[0].x);
gl_info->gl_ops.gl.p_glVertex2i(dst_rect->left, dst_rect->top);
gl_info->gl_ops.gl.p_glTexCoord3fv(info.coords[1]);
gl_info->gl_ops.gl.p_glTexCoord3fv(&info.texcoords[1].x);
gl_info->gl_ops.gl.p_glVertex2i(dst_rect->right, dst_rect->top);
gl_info->gl_ops.gl.p_glTexCoord3fv(info.coords[2]);
gl_info->gl_ops.gl.p_glTexCoord3fv(&info.texcoords[2].x);
gl_info->gl_ops.gl.p_glVertex2i(dst_rect->left, dst_rect->bottom);
gl_info->gl_ops.gl.p_glTexCoord3fv(info.coords[3]);
gl_info->gl_ops.gl.p_glTexCoord3fv(&info.texcoords[3].x);
gl_info->gl_ops.gl.p_glVertex2i(dst_rect->right, dst_rect->bottom);
gl_info->gl_ops.gl.p_glEnd();
@ -2561,13 +2561,13 @@ static void surface_depth_blt(const struct wined3d_surface *surface, struct wine
gl_info, info.tex_type, &surface->ds_current_size);
gl_info->gl_ops.gl.p_glBegin(GL_TRIANGLE_STRIP);
gl_info->gl_ops.gl.p_glTexCoord3fv(info.coords[0]);
gl_info->gl_ops.gl.p_glTexCoord3fv(&info.texcoords[0].x);
gl_info->gl_ops.gl.p_glVertex2f(-1.0f, -1.0f);
gl_info->gl_ops.gl.p_glTexCoord3fv(info.coords[1]);
gl_info->gl_ops.gl.p_glTexCoord3fv(&info.texcoords[1].x);
gl_info->gl_ops.gl.p_glVertex2f(1.0f, -1.0f);
gl_info->gl_ops.gl.p_glTexCoord3fv(info.coords[2]);
gl_info->gl_ops.gl.p_glTexCoord3fv(&info.texcoords[2].x);
gl_info->gl_ops.gl.p_glVertex2f(-1.0f, 1.0f);
gl_info->gl_ops.gl.p_glTexCoord3fv(info.coords[3]);
gl_info->gl_ops.gl.p_glTexCoord3fv(&info.texcoords[3].x);
gl_info->gl_ops.gl.p_glVertex2f(1.0f, 1.0f);
gl_info->gl_ops.gl.p_glEnd();