wined3d: The namedArrays code path is dead (always FALSE).

Delete the entire namedArrays code path and all its dependencies (one
of which is quite long - storeOrder in drawprim is always FALSE, for
example). Delete declaredArrays, and make its code path the default.
This commit is contained in:
Ivan Gyurdiev 2006-06-12 02:51:58 -04:00 committed by Alexandre Julliard
parent 3692219db4
commit f144d58ac2
5 changed files with 43 additions and 183 deletions

View File

@ -685,6 +685,12 @@ void generate_base_shader(
FIXME("Unrecognized opcode: token=%08lX\n", opcode_token); FIXME("Unrecognized opcode: token=%08lX\n", opcode_token);
pToken += shader_skip_unrecognized(iface, pToken); pToken += shader_skip_unrecognized(iface, pToken);
/* Nothing to do */
} else if (D3DSIO_DCL == curOpcode->opcode ||
D3DSIO_NOP == curOpcode->opcode) {
pToken += shader_skip_opcode(This, curOpcode, opcode_token);
/* If a generator function is set for current shader target, use it */ /* If a generator function is set for current shader target, use it */
} else if (hw_fct != NULL) { } else if (hw_fct != NULL) {
@ -694,12 +700,7 @@ void generate_base_shader(
DWORD param, addr_token = 0; DWORD param, addr_token = 0;
/* DCL instruction has usage dst parameter, not register */
if (curOpcode->opcode == D3DSIO_DCL)
param = *pToken++;
else
pToken += shader_get_param(iface, pToken, &param, &addr_token); pToken += shader_get_param(iface, pToken, &param, &addr_token);
hw_arg.dst = param; hw_arg.dst = param;
hw_arg.dst_addr = addr_token; hw_arg.dst_addr = addr_token;
@ -724,15 +725,13 @@ void generate_base_shader(
/* Call appropriate function for output target */ /* Call appropriate function for output target */
hw_fct(&hw_arg); hw_fct(&hw_arg);
/* Unhandled opcode */
} else { } else {
/* Unless we encounter a no-op command, this opcode is unrecognized */
if (curOpcode->opcode != D3DSIO_NOP) {
FIXME("Can't handle opcode %s in hwShader\n", curOpcode->name); FIXME("Can't handle opcode %s in hwShader\n", curOpcode->name);
pToken += shader_skip_opcode(This, curOpcode, opcode_token); pToken += shader_skip_opcode(This, curOpcode, opcode_token);
} }
} }
}
/* TODO: What about result.depth? */ /* TODO: What about result.depth? */
} }
@ -763,7 +762,7 @@ void shader_dump_ins_modifiers(const DWORD output) {
FIXME("_unrecognized_modifier(%#lx)", mmask >> D3DSP_DSTMOD_SHIFT); FIXME("_unrecognized_modifier(%#lx)", mmask >> D3DSP_DSTMOD_SHIFT);
} }
/** Process the D3DSIO_DCL opcode into an ARB string - creates a local vec4 /** Process the D3DSIO_DEF opcode into an ARB string - creates a local vec4
* float constant, and stores it's usage on the regmaps. */ * float constant, and stores it's usage on the regmaps. */
void shader_hw_def(SHADER_OPCODE_ARG* arg) { void shader_hw_def(SHADER_OPCODE_ARG* arg) {

View File

@ -315,7 +315,13 @@ static BOOL primitiveInitState(IWineD3DDevice *iface, BOOL vtx_transformed, BOOL
return isLightingOn; return isLightingOn;
} }
void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVertexShaderFunction, WineDirect3DVertexStridedData *strided, LONG BaseVertexIndex, DWORD *fvf, BOOL storeOrder, INT arrayUsageMap[WINED3DSHADERDECLUSAGE_MAX_USAGE]) { void primitiveDeclarationConvertToStridedData(
IWineD3DDevice *iface,
BOOL useVertexShaderFunction,
WineDirect3DVertexStridedData *strided,
LONG BaseVertexIndex,
DWORD *fvf) {
/* We need to deal with frequency data!*/ /* We need to deal with frequency data!*/
int textureNo =0; int textureNo =0;
@ -374,7 +380,6 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.position.dwType = element->Type; strided->u.s.position.dwType = element->Type;
strided->u.s.position.dwStride = stride; strided->u.s.position.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "position", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "position", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITION] = element->Reg;
break; break;
case 1: /* tweened see http://www.gamedev.net/reference/articles/article2017.asp */ case 1: /* tweened see http://www.gamedev.net/reference/articles/article2017.asp */
TRACE("Tweened positions\n"); TRACE("Tweened positions\n");
@ -382,7 +387,6 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.position2.dwType = element->Type; strided->u.s.position2.dwType = element->Type;
strided->u.s.position2.dwStride = stride; strided->u.s.position2.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "position2", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "position2", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITION2] = element->Reg;
break; break;
} }
break; break;
@ -393,7 +397,6 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.normal.dwType = element->Type; strided->u.s.normal.dwType = element->Type;
strided->u.s.normal.dwStride = stride; strided->u.s.normal.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "normal", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "normal", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_NORMAL] = element->Reg;
break; break;
case 1: /* skinning */ case 1: /* skinning */
TRACE("Skinning / tween normals\n"); TRACE("Skinning / tween normals\n");
@ -401,7 +404,6 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.normal2.dwType = element->Type; strided->u.s.normal2.dwType = element->Type;
strided->u.s.normal2.dwStride = stride; strided->u.s.normal2.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "normal2", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "normal2", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_NORMAL2] = element->Reg;
break; break;
} }
*fvf |= D3DFVF_NORMAL; *fvf |= D3DFVF_NORMAL;
@ -414,21 +416,18 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.blendMatrixIndices.dwType = element->Type; strided->u.s.blendMatrixIndices.dwType = element->Type;
strided->u.s.blendMatrixIndices.dwStride= stride; strided->u.s.blendMatrixIndices.dwStride= stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "blendMatrixIndices", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "blendMatrixIndices", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_BLENDINDICES] = element->Reg;
break; break;
case D3DDECLUSAGE_BLENDWEIGHT: case D3DDECLUSAGE_BLENDWEIGHT:
strided->u.s.blendWeights.lpData = data; strided->u.s.blendWeights.lpData = data;
strided->u.s.blendWeights.dwType = element->Type; strided->u.s.blendWeights.dwType = element->Type;
strided->u.s.blendWeights.dwStride = stride; strided->u.s.blendWeights.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "blendWeights", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "blendWeights", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_BLENDWEIGHT] = element->Reg;
break; break;
case D3DDECLUSAGE_PSIZE: case D3DDECLUSAGE_PSIZE:
strided->u.s.pSize.lpData = data; strided->u.s.pSize.lpData = data;
strided->u.s.pSize.dwType = element->Type; strided->u.s.pSize.dwType = element->Type;
strided->u.s.pSize.dwStride = stride; strided->u.s.pSize.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "pSize", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "pSize", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_PSIZE] = element->Reg;
break; break;
case D3DDECLUSAGE_COLOR: case D3DDECLUSAGE_COLOR:
switch (element->UsageIndex) { switch (element->UsageIndex) {
@ -437,14 +436,12 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.diffuse.dwType = element->Type; strided->u.s.diffuse.dwType = element->Type;
strided->u.s.diffuse.dwStride = stride; strided->u.s.diffuse.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "diffuse", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "diffuse", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_DIFFUSE] = element->Reg;
break; break;
case 1: /* specular */ case 1: /* specular */
strided->u.s.specular.lpData = data; strided->u.s.specular.lpData = data;
strided->u.s.specular.dwType = element->Type; strided->u.s.specular.dwType = element->Type;
strided->u.s.specular.dwStride = stride; strided->u.s.specular.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "specular", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "specular", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_SPECULAR] = element->Reg;
} }
@ -457,7 +454,6 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.texCoords[textureNo].dwType = element->Type; strided->u.s.texCoords[textureNo].dwType = element->Type;
strided->u.s.texCoords[textureNo].dwStride = stride; strided->u.s.texCoords[textureNo].dwStride = stride;
TRACE("Set strided %s.%d data %p, type %d. stride %ld\n", "texCoords", textureNo, data, element->Type, stride); TRACE("Set strided %s.%d data %p, type %d. stride %ld\n", "texCoords", textureNo, data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_TEXCOORD0 + textureNo] = element->Reg;
++textureNo; ++textureNo;
break; break;
@ -470,7 +466,6 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.tangent.dwType = element->Type; strided->u.s.tangent.dwType = element->Type;
strided->u.s.tangent.dwStride = stride; strided->u.s.tangent.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "tangent", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "tangent", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_TANGENT] = element->Reg;
break; break;
case D3DDECLUSAGE_BINORMAL: case D3DDECLUSAGE_BINORMAL:
/* Binormals are really bitangents perpendicular to the normal but s-aligned to the tangent, basically they are the vectors of any two lines on the plain at right angles to the normal and at right angles to each other, like the x,y,z axis. /* Binormals are really bitangents perpendicular to the normal but s-aligned to the tangent, basically they are the vectors of any two lines on the plain at right angles to the normal and at right angles to each other, like the x,y,z axis.
@ -482,7 +477,6 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.binormal.dwType = element->Type; strided->u.s.binormal.dwType = element->Type;
strided->u.s.binormal.dwStride = stride; strided->u.s.binormal.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "binormal", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "binormal", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_BINORMAL] = element->Reg;
break; break;
case D3DDECLUSAGE_TESSFACTOR: case D3DDECLUSAGE_TESSFACTOR:
/* a google for D3DDECLUSAGE_TESSFACTOR turns up a whopping 36 entries, 7 of which are from MSDN. /* a google for D3DDECLUSAGE_TESSFACTOR turns up a whopping 36 entries, 7 of which are from MSDN.
@ -492,7 +486,6 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.tessFactor.dwType = element->Type; strided->u.s.tessFactor.dwType = element->Type;
strided->u.s.tessFactor.dwStride = stride; strided->u.s.tessFactor.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "tessFactor", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "tessFactor", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_TESSFACTOR] = element->Reg;
break; break;
case D3DDECLUSAGE_POSITIONT: case D3DDECLUSAGE_POSITIONT:
@ -502,7 +495,6 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.position.dwType = element->Type; strided->u.s.position.dwType = element->Type;
strided->u.s.position.dwStride = stride; strided->u.s.position.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "positionT", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "positionT", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITIONT] = element->Reg;
break; break;
case 1: /* skinning */ case 1: /* skinning */
/* see http://rsn.gamedev.net/tutorials/ms3danim.asp /* see http://rsn.gamedev.net/tutorials/ms3danim.asp
@ -513,7 +505,6 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.position2.dwType = element->Type; strided->u.s.position2.dwType = element->Type;
strided->u.s.position2.dwStride = stride; strided->u.s.position2.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "position2T", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "position2T", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITIONT2] = element->Reg;
break; break;
} }
/* TODO: change fvf usage to a plain boolean flag */ /* TODO: change fvf usage to a plain boolean flag */
@ -533,7 +524,6 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.fog.dwType = element->Type; strided->u.s.fog.dwType = element->Type;
strided->u.s.fog.dwStride = stride; strided->u.s.fog.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "fog", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "fog", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_FOG] = element->Reg;
break; break;
case D3DDECLUSAGE_DEPTH: case D3DDECLUSAGE_DEPTH:
TRACE("depth\n"); TRACE("depth\n");
@ -541,7 +531,6 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.depth.dwType = element->Type; strided->u.s.depth.dwType = element->Type;
strided->u.s.depth.dwStride = stride; strided->u.s.depth.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "depth", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "depth", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_DEPTH] = element->Reg;
break; break;
case D3DDECLUSAGE_SAMPLE: /* VertexShader textures */ case D3DDECLUSAGE_SAMPLE: /* VertexShader textures */
TRACE("depth\n"); TRACE("depth\n");
@ -549,7 +538,6 @@ void primitiveDeclarationConvertToStridedData(IWineD3DDevice *iface, BOOL useVer
strided->u.s.sample.dwType = element->Type; strided->u.s.sample.dwType = element->Type;
strided->u.s.sample.dwStride = stride; strided->u.s.sample.dwStride = stride;
TRACE("Set strided %s. data %p, type %d. stride %ld\n", "sample", data, element->Type, stride); TRACE("Set strided %s. data %p, type %d. stride %ld\n", "sample", data, element->Type, stride);
if (storeOrder) arrayUsageMap[WINED3DSHADERDECLUSAGE_SAMPLE] = element->Reg;
break; break;
}; };
@ -1897,22 +1885,21 @@ UINT numberOfvertices, UINT numberOfIndicies, GLenum glPrimType, const void *idx
fixupVertices(This, dataLocations, &transformedDataLocations, 1 + endStride - startStride, startStride); fixupVertices(This, dataLocations, &transformedDataLocations, 1 + endStride - startStride, startStride);
#endif #endif
/* vertex shaders */
/* If the only vertex data used by the shader is supported by OpenGL then*/ /* If the only vertex data used by the shader is supported by OpenGL then*/
if ((!useVertexShaderFunction && dataLocations->u.s.pSize.lpData == NULL if (!useVertexShaderFunction &&
&& dataLocations->u.s.diffuse.lpData == NULL && dataLocations->u.s.specular.lpData == NULL) dataLocations->u.s.pSize.lpData == NULL &&
|| (useVertexShaderFunction && ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->namedArrays && !((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->declaredArrays)) { dataLocations->u.s.diffuse.lpData == NULL &&
dataLocations->u.s.specular.lpData == NULL) {
/* Load the vertex data using named arrays */ /* Load the vertex data using named arrays */
TRACE("(%p) Loading vertex data\n", This); TRACE("(%p) Loading vertex data\n", This);
loadVertexData(iface, dataLocations); loadVertexData(iface, dataLocations);
} else /* Otherwise */ } else if(useVertexShaderFunction) {
if(useVertexShaderFunction && ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->declaredArrays) {
/* load the array data using ordinal mapping */ /* load the array data using ordinal mapping */
loadNumberedArrays(iface, dataLocations, ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->arrayUsageMap); loadNumberedArrays(iface, dataLocations,
((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->arrayUsageMap);
} else { /* If this happens we must drawStridedSlow later on */ } else { /* If this happens we must drawStridedSlow later on */
TRACE("Not loading vertex data\n"); TRACE("Not loading vertex data\n");
@ -1992,7 +1979,6 @@ UINT numberOfvertices, UINT numberOfIndicies, GLenum glPrimType, const void *idx
/* Cleanup vertex program */ /* Cleanup vertex program */
if (useVertexShaderFunction) { if (useVertexShaderFunction) {
/* disable any attribs (this is the same for both GLSL and ARB modes) */ /* disable any attribs (this is the same for both GLSL and ARB modes) */
if(((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->declaredArrays) {
GLint maxAttribs; GLint maxAttribs;
int i; int i;
/* Leave all the attribs disabled */ /* Leave all the attribs disabled */
@ -2004,7 +1990,6 @@ UINT numberOfvertices, UINT numberOfIndicies, GLenum glPrimType, const void *idx
GL_EXTCALL(glDisableVertexAttribArrayARB(i)); GL_EXTCALL(glDisableVertexAttribArrayARB(i));
checkGLcall("glDisableVertexAttribArrayARB(reg);"); checkGLcall("glDisableVertexAttribArrayARB(reg);");
} }
}
if (wined3d_settings.shader_mode == SHADER_ARB) if (wined3d_settings.shader_mode == SHADER_ARB)
glDisable(GL_VERTEX_PROGRAM_ARB); glDisable(GL_VERTEX_PROGRAM_ARB);
@ -2213,7 +2198,6 @@ void drawPrimitive(IWineD3DDevice *iface,
dataLocations = DrawPrimStrideData; dataLocations = DrawPrimStrideData;
} }
else if (This->stateBlock->vertexDecl != NULL || (useVertexShaderFunction && NULL != ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->vertexDeclaration)) { else if (This->stateBlock->vertexDecl != NULL || (useVertexShaderFunction && NULL != ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->vertexDeclaration)) {
BOOL storeArrays = useVertexShaderFunction && ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->declaredArrays == FALSE && ((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->namedArrays == FALSE;
TRACE("================ Vertex Declaration ===================\n"); TRACE("================ Vertex Declaration ===================\n");
dataLocations = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*dataLocations)); dataLocations = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*dataLocations));
@ -2221,8 +2205,8 @@ void drawPrimitive(IWineD3DDevice *iface,
ERR("Out of memory!\n"); ERR("Out of memory!\n");
return; return;
} }
primitiveDeclarationConvertToStridedData(iface, useVertexShaderFunction, dataLocations, StartVertexIndex, &fvf, storeArrays, primitiveDeclarationConvertToStridedData(iface, useVertexShaderFunction, dataLocations, StartVertexIndex, &fvf);
((IWineD3DVertexShaderImpl *)This->stateBlock->vertexShader)->arrayUsageMap);
} else { } else {
TRACE("================ FVF ===================\n"); TRACE("================ FVF ===================\n");
dataLocations = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*dataLocations)); dataLocations = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*dataLocations));

View File

@ -186,14 +186,8 @@ static void shader_glsl_get_register_name(
|| reg == vshader->arrayUsageMap[WINED3DSHADERDECLUSAGE_SPECULAR]) { || reg == vshader->arrayUsageMap[WINED3DSHADERDECLUSAGE_SPECULAR]) {
(*is_color) = TRUE; (*is_color) = TRUE;
} }
/* if the attributes come in as named dcl's then use a named vertex (called namedVertexN) */
if (vshader->namedArrays) {
sprintf(tmpStr, "namedVertex%lu", reg);
} else {
/* otherwise the input is on a numbered attribute so use opengl numbered attributes */
sprintf(tmpStr, "attrib%lu", reg); sprintf(tmpStr, "attrib%lu", reg);
} }
}
break; break;
case D3DSPR_CONST: case D3DSPR_CONST:
if (arg->reg_maps->constantsF[reg]) { if (arg->reg_maps->constantsF[reg]) {

View File

@ -475,7 +475,6 @@ static void vshader_texldl(WINED3DSHADERVECTOR* d) {
/* Prototype */ /* Prototype */
static void vshader_hw_map2gl(SHADER_OPCODE_ARG* arg); static void vshader_hw_map2gl(SHADER_OPCODE_ARG* arg);
static void vshader_hw_dcl(SHADER_OPCODE_ARG* arg);
static void vshader_hw_mnxn(SHADER_OPCODE_ARG* arg); static void vshader_hw_mnxn(SHADER_OPCODE_ARG* arg);
/** /**
@ -535,7 +534,7 @@ CONST SHADER_OPCODE IWineD3DVertexShaderImpl_shader_ins[] = {
{D3DSIO_M3x2, "m3x2", "undefined", 3, vshader_m3x2, vshader_hw_mnxn, shader_glsl_mnxn, 0, 0}, {D3DSIO_M3x2, "m3x2", "undefined", 3, vshader_m3x2, vshader_hw_mnxn, shader_glsl_mnxn, 0, 0},
/* Declare registers */ /* Declare registers */
{D3DSIO_DCL, "dcl", NULL, 2, vshader_dcl, vshader_hw_dcl, NULL, 0, 0}, {D3DSIO_DCL, "dcl", NULL, 2, vshader_dcl, NULL, NULL, 0, 0},
/* Constant definitions */ /* Constant definitions */
{D3DSIO_DEF, "def", NULL, 5, vshader_def, shader_hw_def, shader_glsl_def, 0, 0}, {D3DSIO_DEF, "def", NULL, 5, vshader_def, shader_hw_def, shader_glsl_def, 0, 0},
@ -654,13 +653,7 @@ inline static void vshader_program_add_param(SHADER_OPCODE_ARG *arg, const DWORD
|| reg == This->arrayUsageMap[WINED3DSHADERDECLUSAGE_SPECULAR]) { || reg == This->arrayUsageMap[WINED3DSHADERDECLUSAGE_SPECULAR]) {
is_color = TRUE; is_color = TRUE;
} }
/* if the attributes come in as named dcl's then use a named vertex (called namedVertexN) */
if (This->namedArrays) {
sprintf(tmpReg, "namedVertex%lu", reg);
} else {
/* otherwise the input is on a numbered attribute so use opengl numbered attributes */
sprintf(tmpReg, "vertex.attrib[%lu]", reg); sprintf(tmpReg, "vertex.attrib[%lu]", reg);
}
strcat(hwLine, tmpReg); strcat(hwLine, tmpReg);
break; break;
case D3DSPR_CONST: case D3DSPR_CONST:
@ -714,7 +707,6 @@ static void vshader_parse_input_decl_usage(IWineD3DVertexShaderImpl *This, INT u
if((usage & 0xF0000) >> 16 == 0) { /* tween data */ if((usage & 0xF0000) >> 16 == 0) { /* tween data */
TRACE("Setting position to %d\n", arrayNo); TRACE("Setting position to %d\n", arrayNo);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITION] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITION] = arrayNo;
This->namedArrays = TRUE;
} else { } else {
/* TODO: position indexes go from 0-8!!*/ /* TODO: position indexes go from 0-8!!*/
TRACE("Setting position 2 to %d because usage = %d\n", arrayNo, (usage & 0xF0000) >> 16); TRACE("Setting position 2 to %d because usage = %d\n", arrayNo, (usage & 0xF0000) >> 16);
@ -723,52 +715,43 @@ static void vshader_parse_input_decl_usage(IWineD3DVertexShaderImpl *This, INT u
TRACE("Loaded for position %d (greater than 2)\n", (usage & 0xF0000) >> 16); TRACE("Loaded for position %d (greater than 2)\n", (usage & 0xF0000) >> 16);
} }
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITION2 + ((usage & 0xF0000) >> 16) -1] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITION2 + ((usage & 0xF0000) >> 16) -1] = arrayNo;
This->declaredArrays = TRUE;
} }
break; break;
case D3DDECLUSAGE_BLENDINDICES: case D3DDECLUSAGE_BLENDINDICES:
/* not supported by openGL */ /* not supported by openGL */
TRACE("Setting BLENDINDICES to %d\n", arrayNo); TRACE("Setting BLENDINDICES to %d\n", arrayNo);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_BLENDINDICES] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_BLENDINDICES] = arrayNo;
This->declaredArrays = TRUE;
if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended BLENDINDICES\n"); if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended BLENDINDICES\n");
break; break;
case D3DDECLUSAGE_BLENDWEIGHT: case D3DDECLUSAGE_BLENDWEIGHT:
TRACE("Setting BLENDWEIGHT to %d\n", arrayNo); TRACE("Setting BLENDWEIGHT to %d\n", arrayNo);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_BLENDWEIGHT] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_BLENDWEIGHT] = arrayNo;
This->namedArrays = TRUE;
if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended blend weights\n"); if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended blend weights\n");
break; break;
case D3DDECLUSAGE_NORMAL: case D3DDECLUSAGE_NORMAL:
if((usage & 0xF0000) >> 16 == 0) { /* tween data */ if((usage & 0xF0000) >> 16 == 0) { /* tween data */
TRACE("Setting normal to %d\n", arrayNo); TRACE("Setting normal to %d\n", arrayNo);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_NORMAL] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_NORMAL] = arrayNo;
This->namedArrays = TRUE;
} else { } else {
TRACE("Setting normal 2 to %d because usage = %d\n", arrayNo, (usage & 0xF0000) >> 16); TRACE("Setting normal 2 to %d because usage = %d\n", arrayNo, (usage & 0xF0000) >> 16);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_NORMAL2] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_NORMAL2] = arrayNo;
This->declaredArrays = TRUE;
} }
break; break;
case D3DDECLUSAGE_PSIZE: case D3DDECLUSAGE_PSIZE:
TRACE("Setting PSIZE to %d\n", arrayNo); TRACE("Setting PSIZE to %d\n", arrayNo);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_PSIZE] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_PSIZE] = arrayNo;
This->namedArrays = TRUE;
if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended PSIZE\n"); if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended PSIZE\n");
break; break;
case D3DDECLUSAGE_COLOR: case D3DDECLUSAGE_COLOR:
if((usage & 0xF0000) >> 16 == 0) { if((usage & 0xF0000) >> 16 == 0) {
TRACE("Setting DIFFUSE to %d\n", arrayNo); TRACE("Setting DIFFUSE to %d\n", arrayNo);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_DIFFUSE] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_DIFFUSE] = arrayNo;
This->namedArrays = TRUE;
} else { } else {
TRACE("Setting SPECULAR to %d\n", arrayNo); TRACE("Setting SPECULAR to %d\n", arrayNo);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_SPECULAR] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_SPECULAR] = arrayNo;
This->namedArrays = TRUE;
} }
break; break;
case D3DDECLUSAGE_TEXCOORD: case D3DDECLUSAGE_TEXCOORD:
This->namedArrays = TRUE;
/* only 7 texture coords have been designed for, so run a quick sanity check */ /* only 7 texture coords have been designed for, so run a quick sanity check */
if ((usage & 0xF0000) >> 16 > 7) { if ((usage & 0xF0000) >> 16 > 7) {
FIXME("(%p) : Program uses texture coordinate %d but only 0-7 have been implemented\n", This, (usage & 0xF0000) >> 16); FIXME("(%p) : Program uses texture coordinate %d but only 0-7 have been implemented\n", This, (usage & 0xF0000) >> 16);
@ -783,27 +766,22 @@ static void vshader_parse_input_decl_usage(IWineD3DVertexShaderImpl *This, INT u
case D3DDECLUSAGE_TANGENT: case D3DDECLUSAGE_TANGENT:
TRACE("Setting TANGENT to %d\n", arrayNo); TRACE("Setting TANGENT to %d\n", arrayNo);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_TANGENT] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_TANGENT] = arrayNo;
This->declaredArrays = TRUE;
break; break;
case D3DDECLUSAGE_BINORMAL: case D3DDECLUSAGE_BINORMAL:
TRACE("Setting BINORMAL to %d\n", arrayNo); TRACE("Setting BINORMAL to %d\n", arrayNo);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_BINORMAL] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_BINORMAL] = arrayNo;
This->declaredArrays = TRUE;
break; break;
case D3DDECLUSAGE_TESSFACTOR: case D3DDECLUSAGE_TESSFACTOR:
TRACE("Setting TESSFACTOR to %d\n", arrayNo); TRACE("Setting TESSFACTOR to %d\n", arrayNo);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_TESSFACTOR] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_TESSFACTOR] = arrayNo;
This->declaredArrays = TRUE;
break; break;
case D3DDECLUSAGE_POSITIONT: case D3DDECLUSAGE_POSITIONT:
if((usage & 0xF0000) >> 16 == 0) { /* tween data */ if((usage & 0xF0000) >> 16 == 0) { /* tween data */
FIXME("Setting positiont to %d\n", arrayNo); FIXME("Setting positiont to %d\n", arrayNo);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITIONT] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITIONT] = arrayNo;
This->namedArrays = TRUE;
} else { } else {
FIXME("Setting positiont 2 to %d because usage = %d\n", arrayNo, (usage & 0xF0000) >> 16); FIXME("Setting positiont 2 to %d because usage = %d\n", arrayNo, (usage & 0xF0000) >> 16);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITIONT2] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_POSITIONT2] = arrayNo;
This->declaredArrays = TRUE;
if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended positiont\n"); if ((usage & 0xF0000) >> 16 != 0) FIXME("Extended positiont\n");
} }
break; break;
@ -811,17 +789,14 @@ static void vshader_parse_input_decl_usage(IWineD3DVertexShaderImpl *This, INT u
/* supported by OpenGL */ /* supported by OpenGL */
TRACE("Setting FOG to %d\n", arrayNo); TRACE("Setting FOG to %d\n", arrayNo);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_FOG] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_FOG] = arrayNo;
This->namedArrays = TRUE;
break; break;
case D3DDECLUSAGE_DEPTH: case D3DDECLUSAGE_DEPTH:
TRACE("Setting DEPTH to %d\n", arrayNo); TRACE("Setting DEPTH to %d\n", arrayNo);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_DEPTH] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_DEPTH] = arrayNo;
This->declaredArrays = TRUE;
break; break;
case D3DDECLUSAGE_SAMPLE: case D3DDECLUSAGE_SAMPLE:
TRACE("Setting SAMPLE to %d\n", arrayNo); TRACE("Setting SAMPLE to %d\n", arrayNo);
This->arrayUsageMap[WINED3DSHADERDECLUSAGE_SAMPLE] = arrayNo; This->arrayUsageMap[WINED3DSHADERDECLUSAGE_SAMPLE] = arrayNo;
This->declaredArrays = TRUE;
break; break;
default: default:
FIXME("Unrecognised dcl %08x", usage & 0xFFFF); FIXME("Unrecognised dcl %08x", usage & 0xFFFF);
@ -901,81 +876,6 @@ static void vshader_hw_map2gl(SHADER_OPCODE_ARG* arg) {
shader_addline(buffer, "%s;\n", tmpLine); shader_addline(buffer, "%s;\n", tmpLine);
} }
static void vshader_hw_dcl(SHADER_OPCODE_ARG* arg) {
DWORD dst = arg->dst;
IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl*) arg->shader;
char tmpLine[256];
SHADER_BUFFER* buffer = arg->buffer;
if (This->namedArrays) {
const char* attribName = "undefined";
switch(dst & 0xFFFF) {
case D3DDECLUSAGE_POSITION:
attribName = "vertex.position";
break;
case D3DDECLUSAGE_BLENDINDICES:
/* not supported by openGL */
attribName = "vertex.blend";
break;
case D3DDECLUSAGE_BLENDWEIGHT:
attribName = "vertex.weight";
break;
case D3DDECLUSAGE_NORMAL:
attribName = "vertex.normal";
break;
case D3DDECLUSAGE_PSIZE:
attribName = "vertex.psize";
break;
case D3DDECLUSAGE_COLOR:
if((dst & 0xF0000) >> 16 == 0) {
attribName = "vertex.color";
} else {
attribName = "vertex.color.secondary";
}
break;
case D3DDECLUSAGE_TEXCOORD:
{
char tmpChar[100];
tmpChar[0] = 0;
sprintf(tmpChar,"vertex.texcoord[%lu]",(dst & 0xF0000) >> 16);
attribName = tmpChar;
break;
}
/* The following aren't directly supported by openGL, so shouldn't come up using namedarrays. */
case D3DDECLUSAGE_TANGENT:
attribName = "vertex.tangent";
break;
case D3DDECLUSAGE_BINORMAL:
attribName = "vertex.binormal";
break;
case D3DDECLUSAGE_TESSFACTOR:
attribName = "vertex.tessfactor";
break;
case D3DDECLUSAGE_POSITIONT:
attribName = "vertex.possitionT";
break;
case D3DDECLUSAGE_FOG:
attribName = "vertex.fogcoord";
break;
case D3DDECLUSAGE_DEPTH:
attribName = "vertex.depth";
break;
case D3DDECLUSAGE_SAMPLE:
attribName = "vertex.sample";
break;
default:
FIXME("Unrecognised dcl %08lx", dst & 0xFFFF);
}
{
sprintf(tmpLine, "ATTRIB ");
vshader_program_add_param(arg, dst, FALSE, tmpLine);
if (This->namedArrays)
shader_addline(buffer, "%s = %s;\n", tmpLine, attribName);
}
}
}
/** Handles transforming all D3DSIO_M?x? opcodes for /** Handles transforming all D3DSIO_M?x? opcodes for
Vertex shaders to ARB_vertex_program codes */ Vertex shaders to ARB_vertex_program codes */
static void vshader_hw_mnxn(SHADER_OPCODE_ARG* arg) { static void vshader_hw_mnxn(SHADER_OPCODE_ARG* arg) {
@ -1509,8 +1409,6 @@ static HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader
TRACE("(%p) : Parsing programme\n", This); TRACE("(%p) : Parsing programme\n", This);
/* Initialise vertex input arrays */ /* Initialise vertex input arrays */
This->namedArrays = FALSE;
This->declaredArrays = FALSE;
for (i = 0; i < WINED3DSHADERDECLUSAGE_MAX_USAGE; i++) for (i = 0; i < WINED3DSHADERDECLUSAGE_MAX_USAGE; i++)
This->arrayUsageMap[i] = -1; This->arrayUsageMap[i] = -1;
@ -1644,22 +1542,9 @@ static HRESULT WINAPI IWineD3DVertexShaderImpl_SetFunction(IWineD3DVertexShader
This->baseShader.functionLength = 1; /* no Function defined use fixed function vertex processing */ This->baseShader.functionLength = 1; /* no Function defined use fixed function vertex processing */
} }
/* Handy for debugging using numbered arrays instead of named arrays */
#if 1
/* TODO: using numbered arrays for software shaders makes things easier */
This->declaredArrays = TRUE;
#endif
/* named arrays and declared arrays are mutually exclusive */
if (This->declaredArrays)
This->namedArrays = FALSE;
/* Generate HW shader in needed */ /* Generate HW shader in needed */
if (NULL != pFunction && wined3d_settings.vs_mode == VS_HW) { if (NULL != pFunction && wined3d_settings.vs_mode == VS_HW)
#if 1
IWineD3DVertexShaderImpl_GenerateShader(iface, pFunction); IWineD3DVertexShaderImpl_GenerateShader(iface, pFunction);
#endif
}
/* copy the function ... because it will certainly be released by application */ /* copy the function ... because it will certainly be released by application */
if (NULL != pFunction) { if (NULL != pFunction) {

View File

@ -1432,9 +1432,7 @@ typedef struct IWineD3DVertexShaderImpl {
DWORD usage; DWORD usage;
/* vertex declaration array mapping */ /* vertex declaration array mapping */
BOOL namedArrays; /* don't map use named functions */ INT arrayUsageMap[WINED3DSHADERDECLUSAGE_MAX_USAGE];
BOOL declaredArrays; /* mapping requires */
INT arrayUsageMap[WINED3DSHADERDECLUSAGE_MAX_USAGE]; /* lookup table for the maps */
/* run time datas... */ /* run time datas... */
VSHADERDATA *data; VSHADERDATA *data;