[PATCH 2/5] wined3d: Store the immediate mode fixed function attribute submission function pointers in struct wined3d_d3d_info.
Henri Verbeet
hverbeet at codeweavers.com
Mon Aug 19 03:50:51 CDT 2013
---
dlls/wined3d/directx.c | 252 +++++++++++++++++++----------------------
dlls/wined3d/drawprim.c | 21 ++--
dlls/wined3d/wined3d_private.h | 23 ++--
3 files changed, 145 insertions(+), 151 deletions(-)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 8320852..6e96233 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -255,20 +255,6 @@ const GLenum magLookup_noFilter[] =
GL_NEAREST, GL_NEAREST, GL_NEAREST,
};
-/* drawStridedSlow attributes */
-glAttribFunc position_funcs[WINED3D_FFP_EMIT_COUNT];
-glAttribFunc diffuse_funcs[WINED3D_FFP_EMIT_COUNT];
-glAttribFunc specular_func_3ubv;
-glAttribFunc specular_funcs[WINED3D_FFP_EMIT_COUNT];
-glAttribFunc normal_funcs[WINED3D_FFP_EMIT_COUNT];
-glMultiTexCoordFunc multi_texcoord_funcs[WINED3D_FFP_EMIT_COUNT];
-
-/**
- * Note: GL seems to trap if GetDeviceCaps is called before any HWND's created,
- * i.e., there is no GL Context - Get a default rendering context to enable the
- * function query some info from GL.
- */
-
struct wined3d_fake_gl_ctx
{
HDC dc;
@@ -4775,11 +4761,14 @@ static void WINE_GLAPI diffuse_d3dcolor(const void *data)
static void WINE_GLAPI specular_d3dcolor(const void *data)
{
DWORD specularColor = *((const DWORD *)data);
- GLbyte d[] = {D3DCOLOR_B_R(specularColor),
- D3DCOLOR_B_G(specularColor),
- D3DCOLOR_B_B(specularColor)};
+ GLubyte d[] =
+ {
+ D3DCOLOR_B_R(specularColor),
+ D3DCOLOR_B_G(specularColor),
+ D3DCOLOR_B_B(specularColor)
+ };
- specular_func_3ubv(d);
+ context_get_current()->gl_info->gl_ops.ext.p_glSecondaryColor3ubvEXT(d);
}
static void WINE_GLAPI warn_no_specular_func(const void *data)
@@ -4787,134 +4776,131 @@ static void WINE_GLAPI warn_no_specular_func(const void *data)
WARN("GL_EXT_secondary_color not supported\n");
}
-static void wined3d_adapter_init_ffp_attrib_ops(const struct wined3d_adapter *adapter)
+static void wined3d_adapter_init_ffp_attrib_ops(struct wined3d_adapter *adapter)
{
- const struct wined3d_d3d_info *d3d_info = &adapter->d3d_info;
const struct wined3d_gl_info *gl_info = &adapter->gl_info;
+ struct wined3d_d3d_info *d3d_info = &adapter->d3d_info;
+ struct wined3d_ffp_attrib_ops *ops = &d3d_info->ffp_attrib_ops;
- position_funcs[WINED3D_FFP_EMIT_FLOAT1] = invalid_func;
- position_funcs[WINED3D_FFP_EMIT_FLOAT2] = invalid_func;
- position_funcs[WINED3D_FFP_EMIT_FLOAT3] = (glAttribFunc)gl_info->gl_ops.gl.p_glVertex3fv;
+ ops->position[WINED3D_FFP_EMIT_FLOAT1] = invalid_func;
+ ops->position[WINED3D_FFP_EMIT_FLOAT2] = invalid_func;
+ ops->position[WINED3D_FFP_EMIT_FLOAT3] = (wined3d_ffp_attrib_func)gl_info->gl_ops.gl.p_glVertex3fv;
if (!d3d_info->xyzrhw)
- position_funcs[WINED3D_FFP_EMIT_FLOAT4] = position_float4;
+ ops->position[WINED3D_FFP_EMIT_FLOAT4] = position_float4;
else
- position_funcs[WINED3D_FFP_EMIT_FLOAT4] = (glAttribFunc)gl_info->gl_ops.gl.p_glVertex4fv;
- position_funcs[WINED3D_FFP_EMIT_D3DCOLOR] = position_d3dcolor;
- position_funcs[WINED3D_FFP_EMIT_UBYTE4] = invalid_func;
- position_funcs[WINED3D_FFP_EMIT_SHORT2] = invalid_func;
- position_funcs[WINED3D_FFP_EMIT_SHORT4] = (glAttribFunc)gl_info->gl_ops.gl.p_glVertex2sv;
- position_funcs[WINED3D_FFP_EMIT_UBYTE4N] = invalid_func;
- position_funcs[WINED3D_FFP_EMIT_SHORT2N] = invalid_func;
- position_funcs[WINED3D_FFP_EMIT_SHORT4N] = invalid_func;
- position_funcs[WINED3D_FFP_EMIT_USHORT2N] = invalid_func;
- position_funcs[WINED3D_FFP_EMIT_USHORT4N] = invalid_func;
- position_funcs[WINED3D_FFP_EMIT_UDEC3] = invalid_func;
- position_funcs[WINED3D_FFP_EMIT_DEC3N] = invalid_func;
- position_funcs[WINED3D_FFP_EMIT_FLOAT16_2] = invalid_func;
- position_funcs[WINED3D_FFP_EMIT_FLOAT16_4] = invalid_func;
- position_funcs[WINED3D_FFP_EMIT_INVALID] = invalid_func;
-
- diffuse_funcs[WINED3D_FFP_EMIT_FLOAT1] = invalid_func;
- diffuse_funcs[WINED3D_FFP_EMIT_FLOAT2] = invalid_func;
- diffuse_funcs[WINED3D_FFP_EMIT_FLOAT3] = (glAttribFunc)gl_info->gl_ops.gl.p_glColor3fv;
- diffuse_funcs[WINED3D_FFP_EMIT_FLOAT4] = (glAttribFunc)gl_info->gl_ops.gl.p_glColor4fv;
- diffuse_funcs[WINED3D_FFP_EMIT_D3DCOLOR] = diffuse_d3dcolor;
- diffuse_funcs[WINED3D_FFP_EMIT_UBYTE4] = invalid_func;
- diffuse_funcs[WINED3D_FFP_EMIT_SHORT2] = invalid_func;
- diffuse_funcs[WINED3D_FFP_EMIT_SHORT4] = invalid_func;
- diffuse_funcs[WINED3D_FFP_EMIT_UBYTE4N] = (glAttribFunc)gl_info->gl_ops.gl.p_glColor4ubv;
- diffuse_funcs[WINED3D_FFP_EMIT_SHORT2N] = invalid_func;
- diffuse_funcs[WINED3D_FFP_EMIT_SHORT4N] = (glAttribFunc)gl_info->gl_ops.gl.p_glColor4sv;
- diffuse_funcs[WINED3D_FFP_EMIT_USHORT2N] = invalid_func;
- diffuse_funcs[WINED3D_FFP_EMIT_USHORT4N] = (glAttribFunc)gl_info->gl_ops.gl.p_glColor4usv;
- diffuse_funcs[WINED3D_FFP_EMIT_UDEC3] = invalid_func;
- diffuse_funcs[WINED3D_FFP_EMIT_DEC3N] = invalid_func;
- diffuse_funcs[WINED3D_FFP_EMIT_FLOAT16_2] = invalid_func;
- diffuse_funcs[WINED3D_FFP_EMIT_FLOAT16_4] = invalid_func;
- diffuse_funcs[WINED3D_FFP_EMIT_INVALID] = invalid_func;
-
- /* No 4 component entry points here */
- specular_funcs[WINED3D_FFP_EMIT_FLOAT1] = invalid_func;
- specular_funcs[WINED3D_FFP_EMIT_FLOAT2] = invalid_func;
+ ops->position[WINED3D_FFP_EMIT_FLOAT4] = (wined3d_ffp_attrib_func)gl_info->gl_ops.gl.p_glVertex4fv;
+ ops->position[WINED3D_FFP_EMIT_D3DCOLOR] = position_d3dcolor;
+ ops->position[WINED3D_FFP_EMIT_UBYTE4] = invalid_func;
+ ops->position[WINED3D_FFP_EMIT_SHORT2] = invalid_func;
+ ops->position[WINED3D_FFP_EMIT_SHORT4] = (wined3d_ffp_attrib_func)gl_info->gl_ops.gl.p_glVertex2sv;
+ ops->position[WINED3D_FFP_EMIT_UBYTE4N] = invalid_func;
+ ops->position[WINED3D_FFP_EMIT_SHORT2N] = invalid_func;
+ ops->position[WINED3D_FFP_EMIT_SHORT4N] = invalid_func;
+ ops->position[WINED3D_FFP_EMIT_USHORT2N] = invalid_func;
+ ops->position[WINED3D_FFP_EMIT_USHORT4N] = invalid_func;
+ ops->position[WINED3D_FFP_EMIT_UDEC3] = invalid_func;
+ ops->position[WINED3D_FFP_EMIT_DEC3N] = invalid_func;
+ ops->position[WINED3D_FFP_EMIT_FLOAT16_2] = invalid_func;
+ ops->position[WINED3D_FFP_EMIT_FLOAT16_4] = invalid_func;
+ ops->position[WINED3D_FFP_EMIT_INVALID] = invalid_func;
+
+ ops->diffuse[WINED3D_FFP_EMIT_FLOAT1] = invalid_func;
+ ops->diffuse[WINED3D_FFP_EMIT_FLOAT2] = invalid_func;
+ ops->diffuse[WINED3D_FFP_EMIT_FLOAT3] = (wined3d_ffp_attrib_func)gl_info->gl_ops.gl.p_glColor3fv;
+ ops->diffuse[WINED3D_FFP_EMIT_FLOAT4] = (wined3d_ffp_attrib_func)gl_info->gl_ops.gl.p_glColor4fv;
+ ops->diffuse[WINED3D_FFP_EMIT_D3DCOLOR] = diffuse_d3dcolor;
+ ops->diffuse[WINED3D_FFP_EMIT_UBYTE4] = invalid_func;
+ ops->diffuse[WINED3D_FFP_EMIT_SHORT2] = invalid_func;
+ ops->diffuse[WINED3D_FFP_EMIT_SHORT4] = invalid_func;
+ ops->diffuse[WINED3D_FFP_EMIT_UBYTE4N] = (wined3d_ffp_attrib_func)gl_info->gl_ops.gl.p_glColor4ubv;
+ ops->diffuse[WINED3D_FFP_EMIT_SHORT2N] = invalid_func;
+ ops->diffuse[WINED3D_FFP_EMIT_SHORT4N] = (wined3d_ffp_attrib_func)gl_info->gl_ops.gl.p_glColor4sv;
+ ops->diffuse[WINED3D_FFP_EMIT_USHORT2N] = invalid_func;
+ ops->diffuse[WINED3D_FFP_EMIT_USHORT4N] = (wined3d_ffp_attrib_func)gl_info->gl_ops.gl.p_glColor4usv;
+ ops->diffuse[WINED3D_FFP_EMIT_UDEC3] = invalid_func;
+ ops->diffuse[WINED3D_FFP_EMIT_DEC3N] = invalid_func;
+ ops->diffuse[WINED3D_FFP_EMIT_FLOAT16_2] = invalid_func;
+ ops->diffuse[WINED3D_FFP_EMIT_FLOAT16_4] = invalid_func;
+ ops->diffuse[WINED3D_FFP_EMIT_INVALID] = invalid_func;
+
+ /* No 4 component entry points here. */
+ ops->specular[WINED3D_FFP_EMIT_FLOAT1] = invalid_func;
+ ops->specular[WINED3D_FFP_EMIT_FLOAT2] = invalid_func;
if (gl_info->supported[EXT_SECONDARY_COLOR])
- {
- specular_funcs[WINED3D_FFP_EMIT_FLOAT3] = (glAttribFunc)GL_EXTCALL(glSecondaryColor3fvEXT);
- }
+ ops->specular[WINED3D_FFP_EMIT_FLOAT3] = (wined3d_ffp_attrib_func)GL_EXTCALL(glSecondaryColor3fvEXT);
else
- {
- specular_funcs[WINED3D_FFP_EMIT_FLOAT3] = warn_no_specular_func;
- }
- specular_funcs[WINED3D_FFP_EMIT_FLOAT4] = invalid_func;
+ ops->specular[WINED3D_FFP_EMIT_FLOAT3] = warn_no_specular_func;
+ ops->specular[WINED3D_FFP_EMIT_FLOAT4] = invalid_func;
if (gl_info->supported[EXT_SECONDARY_COLOR])
+ ops->specular[WINED3D_FFP_EMIT_D3DCOLOR] = specular_d3dcolor;
+ else
+ ops->specular[WINED3D_FFP_EMIT_D3DCOLOR] = warn_no_specular_func;
+ ops->specular[WINED3D_FFP_EMIT_UBYTE4] = invalid_func;
+ ops->specular[WINED3D_FFP_EMIT_SHORT2] = invalid_func;
+ ops->specular[WINED3D_FFP_EMIT_SHORT4] = invalid_func;
+ ops->specular[WINED3D_FFP_EMIT_UBYTE4N] = invalid_func;
+ ops->specular[WINED3D_FFP_EMIT_SHORT2N] = invalid_func;
+ ops->specular[WINED3D_FFP_EMIT_SHORT4N] = invalid_func;
+ ops->specular[WINED3D_FFP_EMIT_USHORT2N] = invalid_func;
+ ops->specular[WINED3D_FFP_EMIT_USHORT4N] = invalid_func;
+ ops->specular[WINED3D_FFP_EMIT_UDEC3] = invalid_func;
+ ops->specular[WINED3D_FFP_EMIT_DEC3N] = invalid_func;
+ ops->specular[WINED3D_FFP_EMIT_FLOAT16_2] = invalid_func;
+ ops->specular[WINED3D_FFP_EMIT_FLOAT16_4] = invalid_func;
+ ops->specular[WINED3D_FFP_EMIT_INVALID] = invalid_func;
+
+ /* Only 3 component entry points here. Test how others behave. Float4
+ * normals are used by one of our tests, trying to pass it to the pixel
+ * shader, which fails on Windows. */
+ ops->normal[WINED3D_FFP_EMIT_FLOAT1] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_FLOAT2] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_FLOAT3] = (wined3d_ffp_attrib_func)gl_info->gl_ops.gl.p_glNormal3fv;
+ /* Just ignore the 4th value. */
+ ops->normal[WINED3D_FFP_EMIT_FLOAT4] = (wined3d_ffp_attrib_func)gl_info->gl_ops.gl.p_glNormal3fv;
+ ops->normal[WINED3D_FFP_EMIT_D3DCOLOR] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_UBYTE4] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_SHORT2] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_SHORT4] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_UBYTE4N] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_SHORT2N] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_SHORT4N] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_USHORT2N] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_USHORT4N] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_UDEC3] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_DEC3N] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_FLOAT16_2] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_FLOAT16_4] = invalid_func;
+ ops->normal[WINED3D_FFP_EMIT_INVALID] = invalid_func;
+
+ ops->texcoord[WINED3D_FFP_EMIT_FLOAT1] = (wined3d_ffp_texcoord_func)gl_info->gl_ops.ext.p_glMultiTexCoord1fvARB;
+ ops->texcoord[WINED3D_FFP_EMIT_FLOAT2] = (wined3d_ffp_texcoord_func)gl_info->gl_ops.ext.p_glMultiTexCoord2fvARB;
+ ops->texcoord[WINED3D_FFP_EMIT_FLOAT3] = (wined3d_ffp_texcoord_func)gl_info->gl_ops.ext.p_glMultiTexCoord3fvARB;
+ ops->texcoord[WINED3D_FFP_EMIT_FLOAT4] = (wined3d_ffp_texcoord_func)gl_info->gl_ops.ext.p_glMultiTexCoord4fvARB;
+ ops->texcoord[WINED3D_FFP_EMIT_D3DCOLOR] = invalid_texcoord_func;
+ ops->texcoord[WINED3D_FFP_EMIT_UBYTE4] = invalid_texcoord_func;
+ ops->texcoord[WINED3D_FFP_EMIT_SHORT2] = (wined3d_ffp_texcoord_func)gl_info->gl_ops.ext.p_glMultiTexCoord2svARB;
+ ops->texcoord[WINED3D_FFP_EMIT_SHORT4] = (wined3d_ffp_texcoord_func)gl_info->gl_ops.ext.p_glMultiTexCoord4svARB;
+ ops->texcoord[WINED3D_FFP_EMIT_UBYTE4N] = invalid_texcoord_func;
+ ops->texcoord[WINED3D_FFP_EMIT_SHORT2N] = invalid_texcoord_func;
+ ops->texcoord[WINED3D_FFP_EMIT_SHORT4N] = invalid_texcoord_func;
+ ops->texcoord[WINED3D_FFP_EMIT_USHORT2N] = invalid_texcoord_func;
+ ops->texcoord[WINED3D_FFP_EMIT_USHORT4N] = invalid_texcoord_func;
+ ops->texcoord[WINED3D_FFP_EMIT_UDEC3] = invalid_texcoord_func;
+ ops->texcoord[WINED3D_FFP_EMIT_DEC3N] = invalid_texcoord_func;
+ if (gl_info->supported[NV_HALF_FLOAT])
{
- specular_func_3ubv = (glAttribFunc)GL_EXTCALL(glSecondaryColor3ubvEXT);
- specular_funcs[WINED3D_FFP_EMIT_D3DCOLOR] = specular_d3dcolor;
+ /* Not supported by ARB_HALF_FLOAT_VERTEX, so check for NV_HALF_FLOAT. */
+ ops->texcoord[WINED3D_FFP_EMIT_FLOAT16_2] =
+ (wined3d_ffp_texcoord_func)gl_info->gl_ops.ext.p_glMultiTexCoord2hvNV;
+ ops->texcoord[WINED3D_FFP_EMIT_FLOAT16_4] =
+ (wined3d_ffp_texcoord_func)gl_info->gl_ops.ext.p_glMultiTexCoord4hvNV;
}
else
{
- specular_funcs[WINED3D_FFP_EMIT_D3DCOLOR] = warn_no_specular_func;
- }
- specular_funcs[WINED3D_FFP_EMIT_UBYTE4] = invalid_func;
- specular_funcs[WINED3D_FFP_EMIT_SHORT2] = invalid_func;
- specular_funcs[WINED3D_FFP_EMIT_SHORT4] = invalid_func;
- specular_funcs[WINED3D_FFP_EMIT_UBYTE4N] = invalid_func;
- specular_funcs[WINED3D_FFP_EMIT_SHORT2N] = invalid_func;
- specular_funcs[WINED3D_FFP_EMIT_SHORT4N] = invalid_func;
- specular_funcs[WINED3D_FFP_EMIT_USHORT2N] = invalid_func;
- specular_funcs[WINED3D_FFP_EMIT_USHORT4N] = invalid_func;
- specular_funcs[WINED3D_FFP_EMIT_UDEC3] = invalid_func;
- specular_funcs[WINED3D_FFP_EMIT_DEC3N] = invalid_func;
- specular_funcs[WINED3D_FFP_EMIT_FLOAT16_2] = invalid_func;
- specular_funcs[WINED3D_FFP_EMIT_FLOAT16_4] = invalid_func;
- specular_funcs[WINED3D_FFP_EMIT_INVALID] = invalid_func;
-
- /* Only 3 component entry points here. Test how others behave. Float4 normals are used
- * by one of our tests, trying to pass it to the pixel shader, which fails on Windows.
- */
- normal_funcs[WINED3D_FFP_EMIT_FLOAT1] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_FLOAT2] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_FLOAT3] = (glAttribFunc)gl_info->gl_ops.gl.p_glNormal3fv;
- normal_funcs[WINED3D_FFP_EMIT_FLOAT4] = (glAttribFunc)gl_info->gl_ops.gl.p_glNormal3fv; /* Just ignore the 4th value */
- normal_funcs[WINED3D_FFP_EMIT_D3DCOLOR] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_UBYTE4] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_SHORT2] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_SHORT4] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_UBYTE4N] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_SHORT2N] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_SHORT4N] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_USHORT2N] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_USHORT4N] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_UDEC3] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_DEC3N] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_FLOAT16_2] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_FLOAT16_4] = invalid_func;
- normal_funcs[WINED3D_FFP_EMIT_INVALID] = invalid_func;
-
- multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT1] = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord1fvARB);
- multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT2] = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord2fvARB);
- multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT3] = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord3fvARB);
- multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT4] = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord4fvARB);
- multi_texcoord_funcs[WINED3D_FFP_EMIT_D3DCOLOR] = invalid_texcoord_func;
- multi_texcoord_funcs[WINED3D_FFP_EMIT_UBYTE4] = invalid_texcoord_func;
- multi_texcoord_funcs[WINED3D_FFP_EMIT_SHORT2] = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord2svARB);
- multi_texcoord_funcs[WINED3D_FFP_EMIT_SHORT4] = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord4svARB);
- multi_texcoord_funcs[WINED3D_FFP_EMIT_UBYTE4N] = invalid_texcoord_func;
- multi_texcoord_funcs[WINED3D_FFP_EMIT_SHORT2N] = invalid_texcoord_func;
- multi_texcoord_funcs[WINED3D_FFP_EMIT_SHORT4N] = invalid_texcoord_func;
- multi_texcoord_funcs[WINED3D_FFP_EMIT_USHORT2N] = invalid_texcoord_func;
- multi_texcoord_funcs[WINED3D_FFP_EMIT_USHORT4N] = invalid_texcoord_func;
- multi_texcoord_funcs[WINED3D_FFP_EMIT_UDEC3] = invalid_texcoord_func;
- multi_texcoord_funcs[WINED3D_FFP_EMIT_DEC3N] = invalid_texcoord_func;
- if (gl_info->supported[NV_HALF_FLOAT])
- {
- /* Not supported by ARB_HALF_FLOAT_VERTEX, so check for NV_HALF_FLOAT */
- multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT16_2] = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord2hvNV);
- multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT16_4] = (glMultiTexCoordFunc)GL_EXTCALL(glMultiTexCoord4hvNV);
- } else {
- multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT16_2] = invalid_texcoord_func;
- multi_texcoord_funcs[WINED3D_FFP_EMIT_FLOAT16_4] = invalid_texcoord_func;
+ ops->texcoord[WINED3D_FFP_EMIT_FLOAT16_2] = invalid_texcoord_func;
+ ops->texcoord[WINED3D_FFP_EMIT_FLOAT16_4] = invalid_texcoord_func;
}
- multi_texcoord_funcs[WINED3D_FFP_EMIT_INVALID] = invalid_texcoord_func;
+ ops->texcoord[WINED3D_FFP_EMIT_INVALID] = invalid_texcoord_func;
}
static void wined3d_adapter_init_fb_cfgs(struct wined3d_adapter *adapter, HDC dc)
diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c
index c75ab59..6c54a94 100644
--- a/dlls/wined3d/drawprim.c
+++ b/dlls/wined3d/drawprim.c
@@ -99,6 +99,7 @@ static void drawStridedSlow(const struct wined3d_device *device, const struct wi
const BYTE *diffuse = NULL, *specular = NULL, *normal = NULL, *position = NULL;
const struct wined3d_gl_info *gl_info = context->gl_info;
const struct wined3d_d3d_info *d3d_info = context->d3d_info;
+ const struct wined3d_ffp_attrib_ops *ops = &d3d_info->ffp_attrib_ops;
UINT texture_stages = d3d_info->limits.ffp_blend_stages;
const struct wined3d_stream_info_element *element;
UINT num_untracked_materials;
@@ -266,15 +267,16 @@ static void drawStridedSlow(const struct wined3d_device *device, const struct wi
ptr = texCoords[coord_idx] + (SkipnStrides * si->elements[WINED3D_FFP_TEXCOORD0 + coord_idx].stride);
texture_idx = device->texUnitMap[texture];
- multi_texcoord_funcs[si->elements[WINED3D_FFP_TEXCOORD0 + coord_idx].format->emit_idx](
+ ops->texcoord[si->elements[WINED3D_FFP_TEXCOORD0 + coord_idx].format->emit_idx](
GL_TEXTURE0_ARB + texture_idx, ptr);
}
/* Diffuse -------------------------------- */
- if (diffuse) {
+ if (diffuse)
+ {
const void *ptrToCoords = diffuse + SkipnStrides * si->elements[WINED3D_FFP_DIFFUSE].stride;
+ ops->diffuse[si->elements[WINED3D_FFP_DIFFUSE].format->emit_idx](ptrToCoords);
- diffuse_funcs[si->elements[WINED3D_FFP_DIFFUSE].format->emit_idx](ptrToCoords);
if (num_untracked_materials)
{
DWORD diffuseColor = ((const DWORD *)ptrToCoords)[0];
@@ -294,10 +296,10 @@ static void drawStridedSlow(const struct wined3d_device *device, const struct wi
}
/* Specular ------------------------------- */
- if (specular) {
+ if (specular)
+ {
const void *ptrToCoords = specular + SkipnStrides * si->elements[WINED3D_FFP_SPECULAR].stride;
-
- specular_funcs[si->elements[WINED3D_FFP_SPECULAR].format->emit_idx](ptrToCoords);
+ ops->specular[si->elements[WINED3D_FFP_SPECULAR].format->emit_idx](ptrToCoords);
if (specular_fog)
{
@@ -310,13 +312,14 @@ static void drawStridedSlow(const struct wined3d_device *device, const struct wi
if (normal)
{
const void *ptrToCoords = normal + SkipnStrides * si->elements[WINED3D_FFP_NORMAL].stride;
- normal_funcs[si->elements[WINED3D_FFP_NORMAL].format->emit_idx](ptrToCoords);
+ ops->normal[si->elements[WINED3D_FFP_NORMAL].format->emit_idx](ptrToCoords);
}
/* Position -------------------------------- */
- if (position) {
+ if (position)
+ {
const void *ptrToCoords = position + SkipnStrides * si->elements[WINED3D_FFP_POSITION].stride;
- position_funcs[si->elements[WINED3D_FFP_POSITION].format->emit_idx](ptrToCoords);
+ ops->position[si->elements[WINED3D_FFP_POSITION].format->emit_idx](ptrToCoords);
}
/* For non indexed mode, step onto next parts */
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index d58b6e9..cee9651 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -944,15 +944,6 @@ void draw_primitive(struct wined3d_device *device, UINT start_idx, UINT index_co
UINT start_instance, UINT instance_count, BOOL indexed) DECLSPEC_HIDDEN;
DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) DECLSPEC_HIDDEN;
-typedef void (WINE_GLAPI *glAttribFunc)(const void *data);
-typedef void (WINE_GLAPI *glMultiTexCoordFunc)(GLenum unit, const void *data);
-extern glAttribFunc position_funcs[WINED3D_FFP_EMIT_COUNT] DECLSPEC_HIDDEN;
-extern glAttribFunc diffuse_funcs[WINED3D_FFP_EMIT_COUNT] DECLSPEC_HIDDEN;
-extern glAttribFunc specular_func_3ubv DECLSPEC_HIDDEN;
-extern glAttribFunc specular_funcs[WINED3D_FFP_EMIT_COUNT] DECLSPEC_HIDDEN;
-extern glAttribFunc normal_funcs[WINED3D_FFP_EMIT_COUNT] DECLSPEC_HIDDEN;
-extern glMultiTexCoordFunc multi_texcoord_funcs[WINED3D_FFP_EMIT_COUNT] DECLSPEC_HIDDEN;
-
#define eps 1e-8
#define GET_TEXCOORD_SIZE_FROM_FVF(d3dvtVertexType, tex_num) \
@@ -1612,9 +1603,23 @@ struct wined3d_d3d_limits
UINT ffp_blend_stages;
};
+typedef void (WINE_GLAPI *wined3d_ffp_attrib_func)(const void *data);
+typedef void (WINE_GLAPI *wined3d_ffp_texcoord_func)(GLenum unit, const void *data);
+extern wined3d_ffp_attrib_func specular_func_3ubv DECLSPEC_HIDDEN;
+
+struct wined3d_ffp_attrib_ops
+{
+ wined3d_ffp_attrib_func position[WINED3D_FFP_EMIT_COUNT];
+ wined3d_ffp_attrib_func diffuse[WINED3D_FFP_EMIT_COUNT];
+ wined3d_ffp_attrib_func specular[WINED3D_FFP_EMIT_COUNT];
+ wined3d_ffp_attrib_func normal[WINED3D_FFP_EMIT_COUNT];
+ wined3d_ffp_texcoord_func texcoord[WINED3D_FFP_EMIT_COUNT];
+};
+
struct wined3d_d3d_info
{
struct wined3d_d3d_limits limits;
+ struct wined3d_ffp_attrib_ops ffp_attrib_ops;
BOOL xyzrhw;
BOOL vs_clipping;
DWORD valid_rt_mask;
--
1.8.1.5
More information about the wine-patches
mailing list