wined3d: Move transforms to wined3d_state.

This commit is contained in:
Henri Verbeet 2010-09-16 11:19:56 +02:00 committed by Alexandre Julliard
parent 5f6ced2767
commit 597da9907a
4 changed files with 46 additions and 33 deletions

View File

@ -2413,7 +2413,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTransform(IWineD3DDevice *iface, W
if (This->isRecordingState) {
TRACE("Recording... not performing anything\n");
This->updateStateBlock->changed.transform[d3dts >> 5] |= 1 << (d3dts & 0x1f);
This->updateStateBlock->transforms[d3dts] = *lpmatrix;
This->updateStateBlock->state.transforms[d3dts] = *lpmatrix;
return WINED3D_OK;
}
@ -2425,11 +2425,14 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTransform(IWineD3DDevice *iface, W
*
* From here on we assume that the new matrix is different, wherever it matters.
*/
if (!memcmp(&This->stateBlock->transforms[d3dts].u.m[0][0], lpmatrix, sizeof(WINED3DMATRIX))) {
if (!memcmp(&This->stateBlock->state.transforms[d3dts].u.m[0][0], lpmatrix, sizeof(*lpmatrix)))
{
TRACE("The app is setting the same matrix over again\n");
return WINED3D_OK;
} else {
conv_mat(lpmatrix, &This->stateBlock->transforms[d3dts].u.m[0][0]);
}
else
{
conv_mat(lpmatrix, &This->stateBlock->state.transforms[d3dts].u.m[0][0]);
}
/*
@ -2452,10 +2455,16 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTransform(IWineD3DDevice *iface, W
return WINED3D_OK;
}
static HRESULT WINAPI IWineD3DDeviceImpl_GetTransform(IWineD3DDevice *iface, WINED3DTRANSFORMSTATETYPE State, WINED3DMATRIX* pMatrix) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
TRACE("(%p) : for Transform State %s\n", This, debug_d3dtstype(State));
*pMatrix = This->stateBlock->transforms[State];
static HRESULT WINAPI IWineD3DDeviceImpl_GetTransform(IWineD3DDevice *iface,
WINED3DTRANSFORMSTATETYPE state, WINED3DMATRIX *matrix)
{
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface;
TRACE("iface %p, state %s, matrix %p.\n", iface, debug_d3dtstype(state), matrix);
*matrix = device->stateBlock->state.transforms[state];
return WINED3D_OK;
}
@ -2473,8 +2482,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_MultiplyTransform(IWineD3DDevice *iface
if (State <= HIGHEST_TRANSFORMSTATE)
{
mat = &This->updateStateBlock->transforms[State];
} else {
mat = &This->updateStateBlock->state.transforms[State];
}
else
{
FIXME("Unhandled transform state!!\n");
}

View File

@ -3246,7 +3246,7 @@ static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, s
generated = (stateblock->textureState[texUnit][WINED3DTSS_TEXCOORDINDEX] & 0xFFFF0000) != WINED3DTSS_TCI_PASSTHRU;
coordIdx = min(stateblock->textureState[texUnit][WINED3DTSS_TEXCOORDINDEX & 0x0000FFFF], MAX_TEXTURES - 1);
set_texture_matrix(&stateblock->transforms[WINED3DTS_TEXTURE0 + texUnit].u.m[0][0],
set_texture_matrix(&stateblock->state.transforms[WINED3DTS_TEXTURE0 + texUnit].u.m[0][0],
stateblock->textureState[texUnit][WINED3DTSS_TEXTURETRANSFORMFLAGS], generated, context->last_was_rhw,
stateblock->device->strided_streams.use_map & (1 << (WINED3D_FFP_TEXCOORD0 + coordIdx))
? stateblock->device->strided_streams.elements[WINED3D_FFP_TEXCOORD0 + coordIdx].format->id
@ -3727,14 +3727,14 @@ static void transform_world(DWORD state, IWineD3DStateBlockImpl *stateblock, str
/* In the general case, the view matrix is the identity matrix */
if (stateblock->device->view_ident)
{
glLoadMatrixf(&stateblock->transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]);
glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]);
checkGLcall("glLoadMatrixf");
}
else
{
glLoadMatrixf(&stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]);
glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_VIEW].u.m[0][0]);
checkGLcall("glLoadMatrixf");
glMultMatrixf(&stateblock->transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]);
glMultMatrixf(&stateblock->state.transforms[WINED3DTS_WORLDMATRIX(0)].u.m[0][0]);
checkGLcall("glMultMatrixf");
}
}
@ -3753,8 +3753,10 @@ static void clipplane(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wi
if(!use_vs(stateblock)) {
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadMatrixf(&stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]);
} else {
glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_VIEW].u.m[0][0]);
}
else
{
/* with vertex shaders, clip planes are not transformed in direct3d,
* in OpenGL they are still transformed by the model view.
* Use this to swap the y coordinate if necessary
@ -3808,14 +3810,14 @@ static void transform_worldex(DWORD state, IWineD3DStateBlockImpl *stateblock, s
*/
if (stateblock->device->view_ident)
{
glLoadMatrixf(&stateblock->transforms[WINED3DTS_WORLDMATRIX(matrix)].u.m[0][0]);
glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_WORLDMATRIX(matrix)].u.m[0][0]);
checkGLcall("glLoadMatrixf");
}
else
{
glLoadMatrixf(&stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]);
glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_VIEW].u.m[0][0]);
checkGLcall("glLoadMatrixf");
glMultMatrixf(&stateblock->transforms[WINED3DTS_WORLDMATRIX(matrix)].u.m[0][0]);
glMultMatrixf(&stateblock->state.transforms[WINED3DTS_WORLDMATRIX(matrix)].u.m[0][0]);
checkGLcall("glMultMatrixf");
}
}
@ -3889,7 +3891,7 @@ static void transform_view(DWORD state, IWineD3DStateBlockImpl *stateblock, stru
glMatrixMode(GL_MODELVIEW);
checkGLcall("glMatrixMode(GL_MODELVIEW)");
glLoadMatrixf(&stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]);
glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_VIEW].u.m[0][0]);
checkGLcall("glLoadMatrixf(...)");
/* Reset lights. TODO: Call light apply func */
@ -4030,7 +4032,7 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock
}
checkGLcall("glScalef");
glMultMatrixf(&stateblock->transforms[WINED3DTS_PROJECTION].u.m[0][0]);
glMultMatrixf(&stateblock->state.transforms[WINED3DTS_PROJECTION].u.m[0][0]);
checkGLcall("glLoadMatrixf");
}
}
@ -4781,7 +4783,7 @@ static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3
/* Light settings are affected by the model view in OpenGL, the View transform in direct3d*/
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadMatrixf(&stateblock->transforms[WINED3DTS_VIEW].u.m[0][0]);
glLoadMatrixf(&stateblock->state.transforms[WINED3DTS_VIEW].u.m[0][0]);
/* Diffuse: */
colRGBA[0] = lightInfo->OriginalParms.Diffuse.r;

View File

@ -710,7 +710,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface)
TRACE("Updating transform %#x.\n", transform);
This->transforms[transform] = targetStateBlock->transforms[transform];
This->state.transforms[transform] = targetStateBlock->state.transforms[transform];
}
if (This->changed.primitive_type) This->gl_primitive_type = targetStateBlock->gl_primitive_type;
@ -968,7 +968,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
for (i = 0; i < This->num_contained_transform_states; ++i)
{
IWineD3DDevice_SetTransform(device, This->contained_transform_states[i],
&This->transforms[This->contained_transform_states[i]]);
&This->state.transforms[This->contained_transform_states[i]]);
}
if (This->changed.primitive_type)
@ -1084,10 +1084,11 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat
This->blockType = WINED3DSBT_INIT;
/* Set some of the defaults for lights, transforms etc */
memcpy(&This->transforms[WINED3DTS_PROJECTION], identity, sizeof(identity));
memcpy(&This->transforms[WINED3DTS_VIEW], identity, sizeof(identity));
for (i = 0; i < 256; ++i) {
memcpy(&This->transforms[WINED3DTS_WORLDMATRIX(i)], identity, sizeof(identity));
memcpy(&This->state.transforms[WINED3DTS_PROJECTION], identity, sizeof(identity));
memcpy(&This->state.transforms[WINED3DTS_VIEW], identity, sizeof(identity));
for (i = 0; i < 256; ++i)
{
memcpy(&This->state.transforms[WINED3DTS_WORLDMATRIX(i)], identity, sizeof(identity));
}
TRACE("Render states\n");
@ -1228,9 +1229,10 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat
This->clip_status.ClipIntersection = 0xFFFFFFFF;
/* Texture Stage States - Put directly into state block, we will call function below */
for (i = 0; i < MAX_TEXTURES; i++) {
for (i = 0; i < MAX_TEXTURES; ++i)
{
TRACE("Setting up default texture states for texture Stage %d\n", i);
memcpy(&This->transforms[WINED3DTS_TEXTURE0 + i], identity, sizeof(identity));
memcpy(&This->state.transforms[WINED3DTS_TEXTURE0 + i], identity, sizeof(identity));
This->textureState[i][WINED3DTSS_COLOROP ] = i ? WINED3DTOP_DISABLE : WINED3DTOP_MODULATE;
This->textureState[i][WINED3DTSS_COLORARG1 ] = WINED3DTA_TEXTURE;
This->textureState[i][WINED3DTSS_COLORARG2 ] = WINED3DTA_CURRENT;

View File

@ -2349,6 +2349,7 @@ struct wined3d_stream_state
struct wined3d_state
{
WINED3DMATRIX transforms[HIGHEST_TRANSFORMSTATE + 1];
WINED3DMATERIAL material;
WINED3DVIEWPORT viewport;
RECT scissor_rect;
@ -2393,9 +2394,6 @@ struct IWineD3DStateBlockImpl
INT baseVertexIndex;
INT loadBaseVertexIndex; /* non-indexed drawing needs 0 here, indexed baseVertexIndex */
/* Transform */
WINED3DMATRIX transforms[HIGHEST_TRANSFORMSTATE + 1];
/* Light hashmap . Collisions are handled using standard wine double linked lists */
#define LIGHTMAP_SIZE 43 /* Use of a prime number recommended. Set to 1 for a linked list! */
#define LIGHTMAP_HASHFUNC(x) ((x) % LIGHTMAP_SIZE) /* Primitive and simple function */