wined3d: Make WINED3D_ATR macros more flexible.

Make them operate on a type, as opposed to a semantic name.
This commit is contained in:
Ivan Gyurdiev 2006-07-07 00:25:14 -06:00 committed by Alexandre Julliard
parent c202bfe40d
commit c611012df5
2 changed files with 55 additions and 40 deletions

View File

@ -812,9 +812,9 @@ void loadNumberedArrays(
curVBO = sd->u.s._arrayName.VBO; \
} \
GL_EXTCALL(glVertexAttribPointerARB(idx, \
WINED3D_ATR_SIZE(_arrayName), \
WINED3D_ATR_GLTYPE(_arrayName), \
WINED3D_ATR_NORMALIZED(_arrayName), \
WINED3D_ATR_SIZE(sd->u.s._arrayName.dwType), \
WINED3D_ATR_GLTYPE(sd->u.s._arrayName.dwType), \
WINED3D_ATR_NORMALIZED(sd->u.s._arrayName.dwType), \
sd->u.s._arrayName.dwStride, \
sd->u.s._arrayName.lpData)); \
GL_EXTCALL(glEnableVertexAttribArrayARB(idx)); \
@ -831,12 +831,13 @@ void loadNumberedArrays(
curVBO = sd->u.s.position2.VBO; \
} \
GL_EXTCALL(glVertexAttribPointerARB(idx, \
WINED3D_ATR_SIZE(position2), \
WINED3D_ATR_GLTYPE(position2), \
WINED3D_ATR_NORMALIZED(position2), \
WINED3D_ATR_SIZE(sd->u.s.position2.dwType), \
WINED3D_ATR_GLTYPE(sd->u.s.position2.dwType), \
WINED3D_ATR_NORMALIZED(sd->u.s.position2.dwType), \
sd->u.s.position2.dwStride, \
((char *)sd->u.s.position2.lpData) + \
WINED3D_ATR_SIZE(position2) * WINED3D_ATR_TYPESIZE(position2) * _lookupNumber)); \
WINED3D_ATR_SIZE(sd->u.s.position2.dwType) * \
WINED3D_ATR_TYPESIZE(sd->u.s.position2.dwType) * _lookupNumber)); \
GL_EXTCALL(glEnableVertexAttribArrayARB(idx)); \
}
@ -913,7 +914,8 @@ static void loadVertexData(IWineD3DDevice *iface, WineDirect3DVertexStridedData
checkGLcall("glEnableClientState(GL_WEIGHT_ARRAY_ARB)");
#endif
TRACE("Blend %d %p %ld\n", WINED3D_ATR_SIZE(blendWeights), sd->u.s.blendWeights.lpData, sd->u.s.blendWeights.dwStride);
TRACE("Blend %d %p %ld\n", WINED3D_ATR_SIZE(sd->u.s.blendWeights.dwType),
sd->u.s.blendWeights.lpData, sd->u.s.blendWeights.dwStride);
/* FIXME("TODO\n");*/
/* Note dwType == float3 or float4 == 2 or 3 */
@ -921,12 +923,12 @@ static void loadVertexData(IWineD3DDevice *iface, WineDirect3DVertexStridedData
/* with this on, the normals appear to be being modified,
but the vertices aren't being translated as they should be
Maybe the world matrix aren't being setup properly? */
glVertexBlendARB(WINED3D_ATR_SIZE(blendWeights) + 1);
glVertexBlendARB(WINED3D_ATR_SIZE(sd->u.s.blendWeights.dwType) + 1);
#endif
VTRACE(("glWeightPointerARB(%d, GL_FLOAT, %ld, %p)\n",
WINED3D_ATR_SIZE(blendWeights) ,
WINED3D_ATR_SIZE(sd->u.s.blendWeights.dwType) ,
sd->u.s.blendWeights.dwStride,
sd->u.s.blendWeights.lpData));
@ -936,9 +938,11 @@ static void loadVertexData(IWineD3DDevice *iface, WineDirect3DVertexStridedData
curVBO = sd->u.s.blendWeights.VBO;
}
GL_EXTCALL(glWeightPointerARB)(WINED3D_ATR_SIZE(blendWeights), WINED3D_ATR_GLTYPE(blendWeights),
sd->u.s.blendWeights.dwStride,
sd->u.s.blendWeights.lpData);
GL_EXTCALL(glWeightPointerARB)(
WINED3D_ATR_SIZE(sd->u.s.blendWeights.dwType),
WINED3D_ATR_GLTYPE(sd->u.s.blendWeights.dwType),
sd->u.s.blendWeights.dwStride,
sd->u.s.blendWeights.lpData);
checkGLcall("glWeightPointerARB");
@ -950,15 +954,15 @@ static void loadVertexData(IWineD3DDevice *iface, WineDirect3DVertexStridedData
}
}
} else if (GL_SUPPORT(EXT_VERTEX_WEIGHTING)) {
/* FIXME("TODO\n");*/
#if 0
GL_EXTCALL(glVertexWeightPointerEXT)(WINED3D_ATR_SIZE(blendWeights), WINED3D_ATR_GLTYPE(blendWeights),
sd->u.s.blendWeights.dwStride,
sd->u.s.blendWeights.lpData);
GL_EXTCALL(glVertexWeightPointerEXT)(
WINED3D_ATR_SIZE(sd->u.s.blendWeights.dwType),
WINED3D_ATR_GLTYPE(sd->u.s.blendWeights.dwType),
sd->u.s.blendWeights.dwStride,
sd->u.s.blendWeights.lpData);
checkGLcall("glVertexWeightPointerEXT(numBlends, ...)");
glEnableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT);
checkGLcall("glEnableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT)");
@ -987,9 +991,10 @@ static void loadVertexData(IWineD3DDevice *iface, WineDirect3DVertexStridedData
/* TODO: fog*/
if (GL_SUPPORT(EXT_FOG_COORD) {
glEnableClientState(GL_FOG_COORDINATE_EXT);
(GL_EXTCALL)(FogCoordPointerEXT)(WINED3D_ATR_GLTYPE(fog),
sd->u.s.fog.dwStride,
sd->u.s.fog.lpData);
(GL_EXTCALL)(FogCoordPointerEXT)(
WINED3D_ATR_GLTYPE(sd->u.s.fog.dwType),
sd->u.s.fog.dwStride,
sd->u.s.fog.lpData);
} else {
/* don't bother falling back to 'slow' as we don't support software FOG yet. */
/* FIXME: fixme once */
@ -1010,17 +1015,19 @@ static void loadVertexData(IWineD3DDevice *iface, WineDirect3DVertexStridedData
if (GL_SUPPORT(EXT_COORDINATE_FRAME) {
if (sd->u.s.tangent.lpData || sd->u.s.tangent.VBO) {
glEnable(GL_TANGENT_ARRAY_EXT);
(GL_EXTCALL)(TangentPointerEXT)(WINED3D_ATR_GLTYPE(tangent),
sd->u.s.tangent.dwStride,
sd->u.s.tangent.lpData);
(GL_EXTCALL)(TangentPointerEXT)(
WINED3D_ATR_GLTYPE(sd->u.s.tangent.dwType),
sd->u.s.tangent.dwStride,
sd->u.s.tangent.lpData);
} else {
glDisable(GL_TANGENT_ARRAY_EXT);
}
if (sd->u.s.binormal.lpData || sd->u.s.binormal.VBO) {
glEnable(GL_BINORMAL_ARRAY_EXT);
(GL_EXTCALL)(BinormalPointerEXT)(WINED3D_ATR_GLTYPE(binormal),
sd->u.s.binormal.dwStride,
sd->u.s.binormal.lpData);
(GL_EXTCALL)(BinormalPointerEXT)(
WINED3D_ATR_GLTYPE(sd->u.s.binormal.dwType),
sd->u.s.binormal.dwStride,
sd->u.s.binormal.lpData);
} else{
glDisable(GL_BINORMAL_ARRAY_EXT);
}
@ -1071,11 +1078,14 @@ static void loadVertexData(IWineD3DDevice *iface, WineDirect3DVertexStridedData
This only applies to user pointer sources, in VBOs the vertices are fixed up
*/
if(sd->u.s.position.VBO == 0) {
glVertexPointer(3 /* min(WINED3D_ATR_SIZE(position),3) */, WINED3D_ATR_GLTYPE(position),
sd->u.s.position.dwStride, sd->u.s.position.lpData);
glVertexPointer(3 /* min(WINED3D_ATR_SIZE(sd->u.s.position.dwType),3) */,
WINED3D_ATR_GLTYPE(sd->u.s.position.dwType),
sd->u.s.position.dwStride, sd->u.s.position.lpData);
} else {
glVertexPointer(WINED3D_ATR_SIZE(position), WINED3D_ATR_GLTYPE(position),
sd->u.s.position.dwStride, sd->u.s.position.lpData);
glVertexPointer(
WINED3D_ATR_SIZE(sd->u.s.position.dwType),
WINED3D_ATR_GLTYPE(sd->u.s.position.dwType),
sd->u.s.position.dwStride, sd->u.s.position.lpData);
}
checkGLcall("glVertexPointer(...)");
glEnableClientState(GL_VERTEX_ARRAY);
@ -1097,9 +1107,10 @@ static void loadVertexData(IWineD3DDevice *iface, WineDirect3DVertexStridedData
checkGLcall("glBindBufferARB");
curVBO = sd->u.s.normal.VBO;
}
glNormalPointer(WINED3D_ATR_GLTYPE(normal),
sd->u.s.normal.dwStride,
sd->u.s.normal.lpData);
glNormalPointer(
WINED3D_ATR_GLTYPE(sd->u.s.normal.dwType),
sd->u.s.normal.dwStride,
sd->u.s.normal.lpData);
checkGLcall("glNormalPointer(...)");
glEnableClientState(GL_NORMAL_ARRAY);
checkGLcall("glEnableClientState(GL_NORMAL_ARRAY)");
@ -1220,7 +1231,11 @@ static void loadVertexData(IWineD3DDevice *iface, WineDirect3DVertexStridedData
curVBO = sd->u.s.texCoords[coordIdx].VBO;
}
/* The coords to supply depend completely on the fvf / vertex shader */
glTexCoordPointer(WINED3D_ATR_SIZE(texCoords[coordIdx]), WINED3D_ATR_GLTYPE(texCoords[coordIdx]), sd->u.s.texCoords[coordIdx].dwStride, sd->u.s.texCoords[coordIdx].lpData);
glTexCoordPointer(
WINED3D_ATR_SIZE(sd->u.s.texCoords[coordIdx].dwType),
WINED3D_ATR_GLTYPE(sd->u.s.texCoords[coordIdx].dwType),
sd->u.s.texCoords[coordIdx].dwStride,
sd->u.s.texCoords[coordIdx].lpData);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}
} else if (!GL_SUPPORT(NV_REGISTER_COMBINERS)) {

View File

@ -111,11 +111,11 @@ static WINED3DGLTYPE const glTypeLookup[D3DDECLTYPE_UNUSED] = {
{D3DDECLTYPE_FLOAT16_2, 2, GL_FLOAT , GL_FALSE ,sizeof(short int)},
{D3DDECLTYPE_FLOAT16_4, 4, GL_FLOAT , GL_FALSE ,sizeof(short int)}};
#define WINED3D_ATR_TYPE(_attribute) glTypeLookup[sd->u.s._attribute.dwType].d3dType
#define WINED3D_ATR_SIZE(_attribute) glTypeLookup[sd->u.s._attribute.dwType].size
#define WINED3D_ATR_GLTYPE(_attribute) glTypeLookup[sd->u.s._attribute.dwType].glType
#define WINED3D_ATR_NORMALIZED(_attribute) glTypeLookup[sd->u.s._attribute.dwType].normalized
#define WINED3D_ATR_TYPESIZE(_attribute) glTypeLookup[sd->u.s._attribute.dwType].typesize
#define WINED3D_ATR_TYPE(type) glTypeLookup[type].d3dType
#define WINED3D_ATR_SIZE(type) glTypeLookup[type].size
#define WINED3D_ATR_GLTYPE(type) glTypeLookup[type].glType
#define WINED3D_ATR_NORMALIZED(type) glTypeLookup[type].normalized
#define WINED3D_ATR_TYPESIZE(type) glTypeLookup[type].typesize
/**
* Settings