=?UTF-8?Q?Stefan=20D=C3=B6singer=20?=: wined3d: Add a function for wined3d_gl_resource_type to texture target conversion.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Apr 7 10:11:28 CDT 2015
Module: wine
Branch: master
Commit: 8a101bc1f5a7ee563d68d6029231e51bea18ead4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8a101bc1f5a7ee563d68d6029231e51bea18ead4
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Mon Apr 6 00:28:52 2015 +0200
wined3d: Add a function for wined3d_gl_resource_type to texture target conversion.
---
dlls/wined3d/arb_program_shader.c | 106 +++++++++++---------------------------
1 file changed, 30 insertions(+), 76 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index e648cc8..0d4d5e1 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -6199,6 +6199,25 @@ static void gen_ffp_instr(struct wined3d_shader_buffer *buffer, unsigned int sta
shader_addline(buffer, "MUL_SAT %s%s, %s, const.z;\n", dstreg, dstmask, dstreg);
}
+static const char *arbfp_texture_target(enum wined3d_gl_resource_type type)
+{
+ switch(type)
+ {
+ case WINED3D_GL_RES_TYPE_TEX_1D:
+ return "1D";
+ case WINED3D_GL_RES_TYPE_TEX_2D:
+ return "2D";
+ case WINED3D_GL_RES_TYPE_TEX_3D:
+ return "3D";
+ case WINED3D_GL_RES_TYPE_TEX_CUBE:
+ return "CUBE";
+ case WINED3D_GL_RES_TYPE_TEX_RECT:
+ return "RECT";
+ default:
+ return "unexpected_resource_type";
+ }
+}
+
static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, const struct wined3d_gl_info *gl_info)
{
unsigned int stage;
@@ -6345,27 +6364,7 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, con
if (!tex_read[stage])
continue;
- switch(settings->op[stage].tex_type)
- {
- case WINED3D_GL_RES_TYPE_TEX_1D:
- textype = "1D";
- break;
- case WINED3D_GL_RES_TYPE_TEX_2D:
- textype = "2D";
- break;
- case WINED3D_GL_RES_TYPE_TEX_3D:
- textype = "3D";
- break;
- case WINED3D_GL_RES_TYPE_TEX_CUBE:
- textype = "CUBE";
- break;
- case WINED3D_GL_RES_TYPE_TEX_RECT:
- textype = "RECT";
- break;
- default:
- textype = "unexpected_textype";
- break;
- }
+ textype = arbfp_texture_target(settings->op[stage].tex_type);
if(settings->op[stage].projected == proj_none) {
instr = "TEX";
@@ -6910,7 +6909,7 @@ static BOOL gen_planar_yuv_read(struct wined3d_shader_buffer *buffer, const stru
char *luminance)
{
char chroma;
- const char *tex, *texinstr;
+ const char *tex, *texinstr = "TXP";
if (type->fixup == COMPLEX_FIXUP_UYVY)
{
@@ -6923,25 +6922,9 @@ static BOOL gen_planar_yuv_read(struct wined3d_shader_buffer *buffer, const stru
*luminance = 'x';
}
- switch (type->res_type)
- {
- case WINED3D_GL_RES_TYPE_TEX_2D:
- tex = "2D";
- texinstr = "TXP";
- break;
-
- case WINED3D_GL_RES_TYPE_TEX_RECT:
- tex = "RECT";
- texinstr = "TEX";
- break;
-
- default:
- /* This is more tricky than just replacing the texture type - we have to navigate
- * properly in the texture to find the correct chroma values
- */
- FIXME("Implement yuv correction for non-2d, non-rect textures\n");
- return FALSE;
- }
+ tex = arbfp_texture_target(type->res_type);
+ if (type->res_type == WINED3D_GL_RES_TYPE_TEX_RECT)
+ texinstr = "TEX";
/* First we have to read the chroma values. This means we need at least two pixels(no filtering),
* or 4 pixels(with filtering). To get the unmodified chromas, we have to rid ourselves of the
@@ -7017,20 +7000,7 @@ static BOOL gen_yv12_read(struct wined3d_shader_buffer *buffer, const struct arb
static const float yv12_coef[]
= {2.0f / 3.0f, 1.0f / 6.0f, (2.0f / 3.0f) + (1.0f / 6.0f), 1.0f / 3.0f};
- switch (type->res_type)
- {
- case WINED3D_GL_RES_TYPE_TEX_2D:
- tex = "2D";
- break;
-
- case WINED3D_GL_RES_TYPE_TEX_RECT:
- tex = "RECT";
- break;
-
- default:
- FIXME("Implement yv12 correction for non-2d, non-rect textures\n");
- return FALSE;
- }
+ tex = arbfp_texture_target(type->res_type);
/* YV12 surfaces contain a WxH sized luminance plane, followed by a (W/2)x(H/2)
* V and a (W/2)x(H/2) U plane, each with 8 bit per pixel. So the effective
@@ -7179,18 +7149,7 @@ static BOOL gen_nv12_read(struct wined3d_shader_buffer *buffer, const struct arb
static const float nv12_coef[]
= {2.0f / 3.0f, 1.0f / 3.0f, 1.0f, 1.0f};
- switch (type->res_type)
- {
- case WINED3D_GL_RES_TYPE_TEX_2D:
- tex = "2D";
- break;
- case WINED3D_GL_RES_TYPE_TEX_RECT:
- tex = "RECT";
- break;
- default:
- FIXME("Implement nv12 correction for non-2d, non-rect textures\n");
- return FALSE;
- }
+ tex = arbfp_texture_target(type->res_type);
/* NV12 surfaces contain a WxH sized luminance plane, followed by a (W/2)x(H/2)
* sized plane where each component is an UV pair. So the effective
@@ -7326,6 +7285,7 @@ static GLuint gen_p8_shader(struct arbfp_blit_priv *priv,
GLenum shader;
struct wined3d_shader_buffer buffer;
GLint pos;
+ const char *tex_target = arbfp_texture_target(type->res_type);
/* Shader header */
if (!shader_buffer_init(&buffer))
@@ -7349,10 +7309,7 @@ static GLuint gen_p8_shader(struct arbfp_blit_priv *priv,
shader_addline(&buffer, "PARAM constants = { 0.996, 0.00195, 0, 0 };\n");
/* The alpha-component contains the palette index */
- if (type->res_type == WINED3D_GL_RES_TYPE_TEX_RECT)
- shader_addline(&buffer, "TEX index, fragment.texcoord[0], texture[0], RECT;\n");
- else
- shader_addline(&buffer, "TEX index, fragment.texcoord[0], texture[0], 2D;\n");
+ shader_addline(&buffer, "TEX index, fragment.texcoord[0], texture[0], %s;\n", tex_target);
/* Scale the index by 255/256 and add a bias of '0.5' in order to sample in the middle */
shader_addline(&buffer, "MAD index.a, index.a, constants.x, constants.y;\n");
@@ -7564,6 +7521,7 @@ static GLuint arbfp_gen_plain_shader(struct arbfp_blit_priv *priv,
GLenum shader;
struct wined3d_shader_buffer buffer;
GLint pos;
+ const char *tex_target = arbfp_texture_target(type->res_type);
/* Shader header */
if (!shader_buffer_init(&buffer))
@@ -7581,11 +7539,7 @@ static GLuint arbfp_gen_plain_shader(struct arbfp_blit_priv *priv,
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, shader));
shader_addline(&buffer, "!!ARBfp1.0\n");
- if (type->res_type == WINED3D_GL_RES_TYPE_TEX_RECT)
- shader_addline(&buffer, "TEX result.color, fragment.texcoord[0], texture[0], RECT;\n");
- else
- shader_addline(&buffer, "TEX result.color, fragment.texcoord[0], texture[0], 2D;\n");
-
+ shader_addline(&buffer, "TEX result.color, fragment.texcoord[0], texture[0], %s;\n", tex_target);
shader_addline(&buffer, "END\n");
GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
More information about the wine-cvs
mailing list