Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
1f029a30
Commit
1f029a30
authored
Oct 14, 2009
by
Henri Verbeet
Committed by
Alexandre Julliard
Oct 14, 2009
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wined3d: Simplify IWineD3DStateBlockImpl_Capture().
Consistently use the stateblock's contained states to determine what to capture.
parent
a24d1479
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
225 additions
and
321 deletions
+225
-321
stateblock.c
dlls/wined3d/stateblock.c
+225
-321
No files found.
dlls/wined3d/stateblock.c
View file @
1f029a30
...
...
@@ -592,376 +592,280 @@ static void record_lights(IWineD3DStateBlockImpl *This, const IWineD3DStateBlock
}
}
static
HRESULT
WINAPI
IWineD3DStateBlockImpl_Capture
(
IWineD3DStateBlock
*
iface
){
IWineD3DStateBlockImpl
*
This
=
(
IWineD3DStateBlockImpl
*
)
iface
;
static
HRESULT
WINAPI
IWineD3DStateBlockImpl_Capture
(
IWineD3DStateBlock
*
iface
)
{
IWineD3DStateBlockImpl
*
This
=
(
IWineD3DStateBlockImpl
*
)
iface
;
IWineD3DStateBlockImpl
*
targetStateBlock
=
This
->
wineD3DDevice
->
stateBlock
;
unsigned
int
i
,
j
;
unsigned
int
i
;
DWORD
map
;
TRACE
(
"(%p) : Updating state block %p ------------------v
\n
"
,
targetStateBlock
,
This
);
/* If not recorded, then update can just recapture */
if
(
This
->
blockType
==
WINED3DSBT_RECORDED
)
{
if
(
This
->
changed
.
vertexShader
&&
This
->
vertexShader
!=
targetStateBlock
->
vertexShader
)
{
TRACE
(
"Updating vertex shader from %p to %p
\n
"
,
This
->
vertexShader
,
targetStateBlock
->
vertexShader
);
/* Recorded => Only update 'changed' values */
if
(
This
->
changed
.
vertexShader
&&
This
->
vertexShader
!=
targetStateBlock
->
vertexShader
)
{
TRACE
(
"Updating vertex shader from %p to %p
\n
"
,
This
->
vertexShader
,
targetStateBlock
->
vertexShader
);
if
(
targetStateBlock
->
vertexShader
)
IWineD3DVertexShader_AddRef
(
targetStateBlock
->
vertexShader
);
if
(
This
->
vertexShader
)
IWineD3DVertexShader_Release
(
This
->
vertexShader
);
This
->
vertexShader
=
targetStateBlock
->
vertexShader
;
}
if
(
targetStateBlock
->
vertexShader
)
IWineD3DVertexShader_AddRef
(
targetStateBlock
->
vertexShader
);
if
(
This
->
vertexShader
)
IWineD3DVertexShader_Release
(
This
->
vertexShader
);
This
->
vertexShader
=
targetStateBlock
->
vertexShader
;
}
/* Vertex Shader Float Constants */
for
(
i
=
0
;
i
<
This
->
num_contained_vs_consts_f
;
++
i
)
{
unsigned
int
idx
=
This
->
contained_vs_consts_f
[
i
];
TRACE
(
"Setting %p from %p %u to {%.8e, %.8e, %.8e, %.8e}.
\n
"
,
This
,
targetStateBlock
,
idx
,
targetStateBlock
->
vertexShaderConstantF
[
idx
*
4
+
0
],
targetStateBlock
->
vertexShaderConstantF
[
idx
*
4
+
1
],
targetStateBlock
->
vertexShaderConstantF
[
idx
*
4
+
2
],
targetStateBlock
->
vertexShaderConstantF
[
idx
*
4
+
3
]);
This
->
vertexShaderConstantF
[
idx
*
4
+
0
]
=
targetStateBlock
->
vertexShaderConstantF
[
idx
*
4
+
0
];
This
->
vertexShaderConstantF
[
idx
*
4
+
1
]
=
targetStateBlock
->
vertexShaderConstantF
[
idx
*
4
+
1
];
This
->
vertexShaderConstantF
[
idx
*
4
+
2
]
=
targetStateBlock
->
vertexShaderConstantF
[
idx
*
4
+
2
];
This
->
vertexShaderConstantF
[
idx
*
4
+
3
]
=
targetStateBlock
->
vertexShaderConstantF
[
idx
*
4
+
3
];
}
/* Vertex Shader Float Constants */
for
(
j
=
0
;
j
<
This
->
num_contained_vs_consts_f
;
++
j
)
{
i
=
This
->
contained_vs_consts_f
[
j
];
TRACE
(
"Setting %p from %p %u to {%f, %f, %f, %f}
\n
"
,
This
,
targetStateBlock
,
i
,
targetStateBlock
->
vertexShaderConstantF
[
i
*
4
],
targetStateBlock
->
vertexShaderConstantF
[
i
*
4
+
1
],
targetStateBlock
->
vertexShaderConstantF
[
i
*
4
+
2
],
targetStateBlock
->
vertexShaderConstantF
[
i
*
4
+
3
]);
/* Vertex Shader Integer Constants */
for
(
i
=
0
;
i
<
This
->
num_contained_vs_consts_i
;
++
i
)
{
unsigned
int
idx
=
This
->
contained_vs_consts_i
[
i
];
TRACE
(
"Setting %p from %p %u to {%d, %d, %d, %d}.
\n
"
,
This
,
targetStateBlock
,
idx
,
targetStateBlock
->
vertexShaderConstantI
[
idx
*
4
+
0
],
targetStateBlock
->
vertexShaderConstantI
[
idx
*
4
+
1
],
targetStateBlock
->
vertexShaderConstantI
[
idx
*
4
+
2
],
targetStateBlock
->
vertexShaderConstantI
[
idx
*
4
+
3
]);
This
->
vertexShaderConstantI
[
idx
*
4
+
0
]
=
targetStateBlock
->
vertexShaderConstantI
[
idx
*
4
+
0
];
This
->
vertexShaderConstantI
[
idx
*
4
+
1
]
=
targetStateBlock
->
vertexShaderConstantI
[
idx
*
4
+
1
];
This
->
vertexShaderConstantI
[
idx
*
4
+
2
]
=
targetStateBlock
->
vertexShaderConstantI
[
idx
*
4
+
2
];
This
->
vertexShaderConstantI
[
idx
*
4
+
3
]
=
targetStateBlock
->
vertexShaderConstantI
[
idx
*
4
+
3
];
}
This
->
vertexShaderConstantF
[
i
*
4
]
=
targetStateBlock
->
vertexShaderConstantF
[
i
*
4
];
This
->
vertexShaderConstantF
[
i
*
4
+
1
]
=
targetStateBlock
->
vertexShaderConstantF
[
i
*
4
+
1
];
This
->
vertexShaderConstantF
[
i
*
4
+
2
]
=
targetStateBlock
->
vertexShaderConstantF
[
i
*
4
+
2
];
This
->
vertexShaderConstantF
[
i
*
4
+
3
]
=
targetStateBlock
->
vertexShaderConstantF
[
i
*
4
+
3
];
}
/* Vertex Shader Boolean Constants */
for
(
i
=
0
;
i
<
This
->
num_contained_vs_consts_b
;
++
i
)
{
unsigned
int
idx
=
This
->
contained_vs_consts_b
[
i
];
/* Vertex Shader Integer Constants */
for
(
j
=
0
;
j
<
This
->
num_contained_vs_consts_i
;
++
j
)
{
i
=
This
->
contained_vs_consts_i
[
j
];
TRACE
(
"Setting %p from %p %u to {%d, %d, %d, %d}
\n
"
,
This
,
targetStateBlock
,
i
,
targetStateBlock
->
vertexShaderConstantI
[
i
*
4
],
targetStateBlock
->
vertexShaderConstantI
[
i
*
4
+
1
],
targetStateBlock
->
vertexShaderConstantI
[
i
*
4
+
2
],
targetStateBlock
->
vertexShaderConstantI
[
i
*
4
+
3
]);
TRACE
(
"Setting %p from %p %u to %s.
\n
"
,
This
,
targetStateBlock
,
idx
,
targetStateBlock
->
vertexShaderConstantB
[
idx
]
?
"TRUE"
:
"FALSE"
);
This
->
vertexShaderConstantI
[
i
*
4
]
=
targetStateBlock
->
vertexShaderConstantI
[
i
*
4
];
This
->
vertexShaderConstantI
[
i
*
4
+
1
]
=
targetStateBlock
->
vertexShaderConstantI
[
i
*
4
+
1
];
This
->
vertexShaderConstantI
[
i
*
4
+
2
]
=
targetStateBlock
->
vertexShaderConstantI
[
i
*
4
+
2
];
This
->
vertexShaderConstantI
[
i
*
4
+
3
]
=
targetStateBlock
->
vertexShaderConstantI
[
i
*
4
+
3
];
}
This
->
vertexShaderConstantB
[
idx
]
=
targetStateBlock
->
vertexShaderConstantB
[
idx
];
}
/* Vertex Shader Boolean Constants */
for
(
j
=
0
;
j
<
This
->
num_contained_vs_consts_b
;
++
j
)
{
i
=
This
->
contained_vs_consts_b
[
j
];
TRACE
(
"Setting %p from %p %u to %s
\n
"
,
This
,
targetStateBlock
,
i
,
targetStateBlock
->
vertexShaderConstantB
[
i
]
?
"TRUE"
:
"FALSE"
);
/* Pixel Shader Float Constants */
for
(
i
=
0
;
i
<
This
->
num_contained_ps_consts_f
;
++
i
)
{
unsigned
int
idx
=
This
->
contained_ps_consts_f
[
i
];
TRACE
(
"Setting %p from %p %u to {%.8e, %.8e, %.8e, %.8e}.
\n
"
,
This
,
targetStateBlock
,
idx
,
targetStateBlock
->
pixelShaderConstantF
[
idx
*
4
+
0
],
targetStateBlock
->
pixelShaderConstantF
[
idx
*
4
+
1
],
targetStateBlock
->
pixelShaderConstantF
[
idx
*
4
+
2
],
targetStateBlock
->
pixelShaderConstantF
[
idx
*
4
+
3
]);
This
->
pixelShaderConstantF
[
idx
*
4
+
0
]
=
targetStateBlock
->
pixelShaderConstantF
[
idx
*
4
+
0
];
This
->
pixelShaderConstantF
[
idx
*
4
+
1
]
=
targetStateBlock
->
pixelShaderConstantF
[
idx
*
4
+
1
];
This
->
pixelShaderConstantF
[
idx
*
4
+
2
]
=
targetStateBlock
->
pixelShaderConstantF
[
idx
*
4
+
2
];
This
->
pixelShaderConstantF
[
idx
*
4
+
3
]
=
targetStateBlock
->
pixelShaderConstantF
[
idx
*
4
+
3
];
}
This
->
vertexShaderConstantB
[
i
]
=
targetStateBlock
->
vertexShaderConstantB
[
i
];
}
/* Pixel Shader Integer Constants */
for
(
i
=
0
;
i
<
This
->
num_contained_ps_consts_i
;
++
i
)
{
unsigned
int
idx
=
This
->
contained_ps_consts_i
[
i
];
TRACE
(
"Setting %p from %p %u to {%d, %d, %d, %d}.
\n
"
,
This
,
targetStateBlock
,
idx
,
targetStateBlock
->
pixelShaderConstantI
[
idx
*
4
+
0
],
targetStateBlock
->
pixelShaderConstantI
[
idx
*
4
+
1
],
targetStateBlock
->
pixelShaderConstantI
[
idx
*
4
+
2
],
targetStateBlock
->
pixelShaderConstantI
[
idx
*
4
+
3
]);
This
->
pixelShaderConstantI
[
idx
*
4
+
0
]
=
targetStateBlock
->
pixelShaderConstantI
[
idx
*
4
+
0
];
This
->
pixelShaderConstantI
[
idx
*
4
+
1
]
=
targetStateBlock
->
pixelShaderConstantI
[
idx
*
4
+
1
];
This
->
pixelShaderConstantI
[
idx
*
4
+
2
]
=
targetStateBlock
->
pixelShaderConstantI
[
idx
*
4
+
2
];
This
->
pixelShaderConstantI
[
idx
*
4
+
3
]
=
targetStateBlock
->
pixelShaderConstantI
[
idx
*
4
+
3
];
}
/* Pixel Shader Float Constants */
for
(
j
=
0
;
j
<
This
->
num_contained_ps_consts_f
;
++
j
)
{
i
=
This
->
contained_ps_consts_f
[
j
];
TRACE
(
"Setting %p from %p %u to {%f, %f, %f, %f}
\n
"
,
This
,
targetStateBlock
,
i
,
targetStateBlock
->
pixelShaderConstantF
[
i
*
4
],
targetStateBlock
->
pixelShaderConstantF
[
i
*
4
+
1
],
targetStateBlock
->
pixelShaderConstantF
[
i
*
4
+
2
],
targetStateBlock
->
pixelShaderConstantF
[
i
*
4
+
3
]);
/* Pixel Shader Boolean Constants */
for
(
i
=
0
;
i
<
This
->
num_contained_ps_consts_b
;
++
i
)
{
unsigned
int
idx
=
This
->
contained_ps_consts_b
[
i
];
TRACE
(
"Setting %p from %p %u to %s.
\n
"
,
This
,
targetStateBlock
,
idx
,
targetStateBlock
->
pixelShaderConstantB
[
idx
]
?
"TRUE"
:
"FALSE"
);
This
->
pixelShaderConstantF
[
i
*
4
]
=
targetStateBlock
->
pixelShaderConstantF
[
i
*
4
];
This
->
pixelShaderConstantF
[
i
*
4
+
1
]
=
targetStateBlock
->
pixelShaderConstantF
[
i
*
4
+
1
];
This
->
pixelShaderConstantF
[
i
*
4
+
2
]
=
targetStateBlock
->
pixelShaderConstantF
[
i
*
4
+
2
];
This
->
pixelShaderConstantF
[
i
*
4
+
3
]
=
targetStateBlock
->
pixelShaderConstantF
[
i
*
4
+
3
];
}
This
->
pixelShaderConstantB
[
idx
]
=
targetStateBlock
->
pixelShaderConstantB
[
idx
];
}
/* Pixel Shader Integer Constants */
for
(
j
=
0
;
j
<
This
->
num_contained_ps_consts_i
;
++
j
)
{
i
=
This
->
contained_ps_consts_i
[
j
];
TRACE
(
"Setting %p from %p %u to {%d, %d, %d, %d}
\n
"
,
This
,
targetStateBlock
,
i
,
targetStateBlock
->
pixelShaderConstantI
[
i
*
4
],
targetStateBlock
->
pixelShaderConstantI
[
i
*
4
+
1
],
targetStateBlock
->
pixelShaderConstantI
[
i
*
4
+
2
],
targetStateBlock
->
pixelShaderConstantI
[
i
*
4
+
3
]);
/* Others + Render & Texture */
for
(
i
=
0
;
i
<
This
->
num_contained_transform_states
;
++
i
)
{
WINED3DTRANSFORMSTATETYPE
transform
=
This
->
contained_transform_states
[
i
];
This
->
pixelShaderConstantI
[
i
*
4
]
=
targetStateBlock
->
pixelShaderConstantI
[
i
*
4
];
This
->
pixelShaderConstantI
[
i
*
4
+
1
]
=
targetStateBlock
->
pixelShaderConstantI
[
i
*
4
+
1
];
This
->
pixelShaderConstantI
[
i
*
4
+
2
]
=
targetStateBlock
->
pixelShaderConstantI
[
i
*
4
+
2
];
This
->
pixelShaderConstantI
[
i
*
4
+
3
]
=
targetStateBlock
->
pixelShaderConstantI
[
i
*
4
+
3
];
}
TRACE
(
"Updating transform %#x.
\n
"
,
transform
);
/* Pixel Shader Boolean Constants */
for
(
j
=
0
;
j
<
This
->
num_contained_ps_consts_b
;
++
j
)
{
i
=
This
->
contained_ps_consts_b
[
j
];
TRACE
(
"Setting %p from %p %u to %s
\n
"
,
This
,
targetStateBlock
,
i
,
targetStateBlock
->
pixelShaderConstantB
[
i
]
?
"TRUE"
:
"FALSE"
);
This
->
transforms
[
transform
]
=
targetStateBlock
->
transforms
[
transform
];
}
This
->
pixelShaderConstantB
[
i
]
=
targetStateBlock
->
pixelShaderConstantB
[
i
];
}
if
(
This
->
changed
.
primitive_type
)
This
->
gl_primitive_type
=
targetStateBlock
->
gl_primitive_type
;
/* Others + Render & Texture */
for
(
i
=
0
;
i
<
This
->
num_contained_transform_states
;
i
++
)
{
TRACE
(
"Updating transform %u
\n
"
,
i
);
This
->
transforms
[
This
->
contained_transform_states
[
i
]]
=
targetStateBlock
->
transforms
[
This
->
contained_transform_states
[
i
]];
}
if
(
This
->
changed
.
indices
&&
((
This
->
pIndexData
!=
targetStateBlock
->
pIndexData
)
||
(
This
->
baseVertexIndex
!=
targetStateBlock
->
baseVertexIndex
)
||
(
This
->
IndexFmt
!=
targetStateBlock
->
IndexFmt
)))
{
TRACE
(
"Updating pIndexData to %p, baseVertexIndex to %d.
\n
"
,
targetStateBlock
->
pIndexData
,
targetStateBlock
->
baseVertexIndex
);
if
(
This
->
changed
.
primitive_type
)
This
->
gl_primitive_type
=
targetStateBlock
->
gl_primitive_type
;
if
(
targetStateBlock
->
pIndexData
)
IWineD3DBuffer_AddRef
(
targetStateBlock
->
pIndexData
);
if
(
This
->
pIndexData
)
IWineD3DBuffer_Release
(
This
->
pIndexData
);
This
->
pIndexData
=
targetStateBlock
->
pIndexData
;
This
->
baseVertexIndex
=
targetStateBlock
->
baseVertexIndex
;
This
->
IndexFmt
=
targetStateBlock
->
IndexFmt
;
}
if
(
This
->
changed
.
indices
&&
((
This
->
pIndexData
!=
targetStateBlock
->
pIndexData
)
||
(
This
->
baseVertexIndex
!=
targetStateBlock
->
baseVertexIndex
)
||
(
This
->
IndexFmt
!=
targetStateBlock
->
IndexFmt
)))
{
TRACE
(
"Updating pIndexData to %p, baseVertexIndex to %d
\n
"
,
targetStateBlock
->
pIndexData
,
targetStateBlock
->
baseVertexIndex
);
if
(
targetStateBlock
->
pIndexData
)
IWineD3DBuffer_AddRef
(
targetStateBlock
->
pIndexData
);
if
(
This
->
pIndexData
)
IWineD3DBuffer_Release
(
This
->
pIndexData
);
This
->
pIndexData
=
targetStateBlock
->
pIndexData
;
This
->
baseVertexIndex
=
targetStateBlock
->
baseVertexIndex
;
This
->
IndexFmt
=
targetStateBlock
->
IndexFmt
;
}
if
(
This
->
changed
.
vertexDecl
&&
This
->
vertexDecl
!=
targetStateBlock
->
vertexDecl
&&
(
This
->
blockType
!=
WINED3DSBT_RECORDED
||
((
IWineD3DImpl
*
)
This
->
wineD3DDevice
->
wineD3D
)
->
dxVersion
!=
9
))
{
TRACE
(
"Updating vertex declaration from %p to %p.
\n
"
,
This
->
vertexDecl
,
targetStateBlock
->
vertexDecl
);
if
(
This
->
changed
.
vertexDecl
&&
This
->
vertexDecl
!=
targetStateBlock
->
vertexDecl
&&
((
IWineD3DImpl
*
)
This
->
wineD3DDevice
->
wineD3D
)
->
dxVersion
!=
9
)
{
TRACE
(
"Updating vertex declaration from %p to %p
\n
"
,
This
->
vertexDecl
,
targetStateBlock
->
vertexDecl
);
if
(
targetStateBlock
->
vertexDecl
)
IWineD3DVertexDeclaration_AddRef
(
targetStateBlock
->
vertexDecl
);
if
(
This
->
vertexDecl
)
IWineD3DVertexDeclaration_Release
(
This
->
vertexDecl
);
This
->
vertexDecl
=
targetStateBlock
->
vertexDecl
;
}
if
(
targetStateBlock
->
vertexDecl
)
IWineD3DVertexDeclaration_AddRef
(
targetStateBlock
->
vertexDecl
);
if
(
This
->
vertexDecl
)
IWineD3DVertexDeclaration_Release
(
This
->
vertexDecl
);
This
->
vertexDecl
=
targetStateBlock
->
vertexDecl
;
}
if
(
This
->
changed
.
material
&&
memcmp
(
&
targetStateBlock
->
material
,
&
This
->
material
,
sizeof
(
This
->
material
)))
{
TRACE
(
"Updating material.
\n
"
);
if
(
This
->
changed
.
material
&&
memcmp
(
&
targetStateBlock
->
material
,
&
This
->
material
,
sizeof
(
WINED3DMATERIAL
))
!=
0
)
{
TRACE
(
"Updating material
\n
"
);
This
->
material
=
targetStateBlock
->
material
;
}
This
->
material
=
targetStateBlock
->
material
;
}
if
(
This
->
changed
.
viewport
&&
memcmp
(
&
targetStateBlock
->
viewport
,
&
This
->
viewport
,
sizeof
(
WINED3DVIEWPORT
))
!=
0
)
{
TRACE
(
"Updating viewport
\n
"
);
This
->
viewport
=
targetStateBlock
->
viewport
;
}
if
(
This
->
changed
.
viewport
&&
memcmp
(
&
targetStateBlock
->
viewport
,
&
This
->
viewport
,
sizeof
(
This
->
viewport
)))
{
TRACE
(
"Updating viewport.
\n
"
);
if
(
This
->
changed
.
scissorRect
&&
memcmp
(
&
targetStateBlock
->
scissorRect
,
&
This
->
scissorRect
,
sizeof
(
targetStateBlock
->
scissorRect
)))
{
TRACE
(
"Updating scissor rect
\n
"
);
targetStateBlock
->
scissorRect
=
This
->
scissorRect
;
}
This
->
viewport
=
targetStateBlock
->
viewport
;
}
map
=
This
->
changed
.
streamSource
;
for
(
i
=
0
;
map
;
map
>>=
1
,
++
i
)
{
if
(
!
(
map
&
1
))
continue
;
if
(
This
->
changed
.
scissorRect
&&
memcmp
(
&
targetStateBlock
->
scissorRect
,
&
This
->
scissorRect
,
sizeof
(
This
->
scissorRect
))
)
{
TRACE
(
"Updating scissor rect.
\n
"
)
;
if
(
This
->
streamStride
[
i
]
!=
targetStateBlock
->
streamStride
[
i
]
||
This
->
streamSource
[
i
]
!=
targetStateBlock
->
streamSource
[
i
])
{
TRACE
(
"Updating stream source %u to %p, stride to %u
\n
"
,
i
,
targetStateBlock
->
streamSource
[
i
],
targetStateBlock
->
streamStride
[
i
]);
This
->
streamStride
[
i
]
=
targetStateBlock
->
streamStride
[
i
];
if
(
targetStateBlock
->
streamSource
[
i
])
IWineD3DBuffer_AddRef
(
targetStateBlock
->
streamSource
[
i
]);
if
(
This
->
streamSource
[
i
])
IWineD3DBuffer_Release
(
This
->
streamSource
[
i
]);
This
->
streamSource
[
i
]
=
targetStateBlock
->
streamSource
[
i
];
}
}
targetStateBlock
->
scissorRect
=
This
->
scissorRect
;
}
map
=
This
->
changed
.
streamFreq
;
for
(
i
=
0
;
map
;
map
>>=
1
,
++
i
)
map
=
This
->
changed
.
streamSource
;
for
(
i
=
0
;
map
;
map
>>=
1
,
++
i
)
{
if
(
!
(
map
&
1
))
continue
;
if
(
This
->
streamStride
[
i
]
!=
targetStateBlock
->
streamStride
[
i
]
||
This
->
streamSource
[
i
]
!=
targetStateBlock
->
streamSource
[
i
])
{
if
(
!
(
map
&
1
))
continue
;
TRACE
(
"Updating stream source %u to %p, stride to %u.
\n
"
,
i
,
targetStateBlock
->
streamSource
[
i
],
targetStateBlock
->
streamStride
[
i
]);
if
(
This
->
streamFreq
[
i
]
!=
targetStateBlock
->
streamFreq
[
i
]
||
This
->
streamFlags
[
i
]
!=
targetStateBlock
->
streamFlags
[
i
])
{
TRACE
(
"Updating stream frequency %u to %u flags to %#x
\n
"
,
i
,
targetStateBlock
->
streamFreq
[
i
],
targetStateBlock
->
streamFlags
[
i
]);
This
->
streamFreq
[
i
]
=
targetStateBlock
->
streamFreq
[
i
];
This
->
streamFlags
[
i
]
=
targetStateBlock
->
streamFlags
[
i
];
}
This
->
streamStride
[
i
]
=
targetStateBlock
->
streamStride
[
i
];
if
(
targetStateBlock
->
streamSource
[
i
])
IWineD3DBuffer_AddRef
(
targetStateBlock
->
streamSource
[
i
]);
if
(
This
->
streamSource
[
i
])
IWineD3DBuffer_Release
(
This
->
streamSource
[
i
]);
This
->
streamSource
[
i
]
=
targetStateBlock
->
streamSource
[
i
];
}
}
map
=
This
->
changed
.
clipplane
;
for
(
i
=
0
;
map
;
map
>>=
1
,
++
i
)
map
=
This
->
changed
.
streamFreq
;
for
(
i
=
0
;
map
;
map
>>=
1
,
++
i
)
{
if
(
!
(
map
&
1
))
continue
;
if
(
This
->
streamFreq
[
i
]
!=
targetStateBlock
->
streamFreq
[
i
]
||
This
->
streamFlags
[
i
]
!=
targetStateBlock
->
streamFlags
[
i
])
{
if
(
!
(
map
&
1
))
continue
;
TRACE
(
"Updating stream frequency %u to %u flags to %#x.
\n
"
,
i
,
targetStateBlock
->
streamFreq
[
i
],
targetStateBlock
->
streamFlags
[
i
]);
if
(
memcmp
(
targetStateBlock
->
clipplane
[
i
],
This
->
clipplane
[
i
],
sizeof
(
*
This
->
clipplane
)))
{
TRACE
(
"Updating clipplane %u
\n
"
,
i
);
memcpy
(
This
->
clipplane
[
i
],
targetStateBlock
->
clipplane
[
i
],
sizeof
(
*
This
->
clipplane
));
}
This
->
streamFreq
[
i
]
=
targetStateBlock
->
streamFreq
[
i
];
This
->
streamFlags
[
i
]
=
targetStateBlock
->
streamFlags
[
i
];
}
}
/* Render */
for
(
i
=
0
;
i
<
This
->
num_contained_render_states
;
i
++
)
{
TRACE
(
"Updating renderState %u to %u
\n
"
,
This
->
contained_render_states
[
i
],
targetStateBlock
->
renderState
[
This
->
contained_render_states
[
i
]]);
This
->
renderState
[
This
->
contained_render_states
[
i
]]
=
targetStateBlock
->
renderState
[
This
->
contained_render_states
[
i
]];
map
=
This
->
changed
.
clipplane
;
for
(
i
=
0
;
map
;
map
>>=
1
,
++
i
)
{
if
(
!
(
map
&
1
))
continue
;
if
(
memcmp
(
targetStateBlock
->
clipplane
[
i
],
This
->
clipplane
[
i
],
sizeof
(
*
This
->
clipplane
)))
{
TRACE
(
"Updating clipplane %u.
\n
"
,
i
);
memcpy
(
This
->
clipplane
[
i
],
targetStateBlock
->
clipplane
[
i
],
sizeof
(
*
This
->
clipplane
));
}
}
/* Texture states
*/
for
(
j
=
0
;
j
<
This
->
num_contained_tss_states
;
j
++
)
{
DWORD
stage
=
This
->
contained_tss_states
[
j
].
stage
;
DWORD
state
=
This
->
contained_tss_states
[
j
].
state
;
/* Render
*/
for
(
i
=
0
;
i
<
This
->
num_contained_render_states
;
++
i
)
{
WINED3DRENDERSTATETYPE
rs
=
This
->
contained_render_states
[
i
]
;
TRACE
(
"Updating texturestage state %u, %u to %u (was %u)
\n
"
,
stage
,
state
,
targetStateBlock
->
textureState
[
stage
][
state
],
This
->
textureState
[
stage
][
state
]);
This
->
textureState
[
stage
][
state
]
=
targetStateBlock
->
textureState
[
stage
][
state
];
}
TRACE
(
"Updating renderState %#x to %u.
\n
"
,
rs
,
targetStateBlock
->
renderState
[
rs
]);
/* Samplers */
map
=
This
->
changed
.
textures
;
for
(
i
=
0
;
map
;
map
>>=
1
,
++
i
)
{
if
(
!
(
map
&
1
))
continue
;
This
->
renderState
[
rs
]
=
targetStateBlock
->
renderState
[
rs
];
}
TRACE
(
"Updating texture %u to %p (was %p)
\n
"
,
i
,
targetStateBlock
->
textures
[
i
],
This
->
textures
[
i
]);
if
(
targetStateBlock
->
textures
[
i
])
IWineD3DBaseTexture_AddRef
(
targetStateBlock
->
textures
[
i
]);
if
(
This
->
textures
[
i
])
IWineD3DBaseTexture_Release
(
This
->
textures
[
i
]);
This
->
textures
[
i
]
=
targetStateBlock
->
textures
[
i
]
;
}
/* Texture states */
for
(
i
=
0
;
i
<
This
->
num_contained_tss_states
;
++
i
)
{
DWORD
stage
=
This
->
contained_tss_states
[
i
].
stage
;
DWORD
state
=
This
->
contained_tss_states
[
i
].
state
;
for
(
j
=
0
;
j
<
This
->
num_contained_sampler_states
;
j
++
)
{
DWORD
stage
=
This
->
contained_sampler_states
[
j
].
stage
;
DWORD
state
=
This
->
contained_sampler_states
[
j
].
state
;
TRACE
(
"Updating sampler state %u, %u to %u (was %u)
\n
"
,
stage
,
state
,
targetStateBlock
->
samplerState
[
stage
][
state
],
This
->
samplerState
[
stage
][
state
]);
This
->
samplerState
[
stage
][
state
]
=
targetStateBlock
->
samplerState
[
stage
][
state
];
}
if
(
This
->
changed
.
pixelShader
&&
This
->
pixelShader
!=
targetStateBlock
->
pixelShader
)
{
if
(
targetStateBlock
->
pixelShader
)
IWineD3DPixelShader_AddRef
(
targetStateBlock
->
pixelShader
);
if
(
This
->
pixelShader
)
IWineD3DPixelShader_Release
(
This
->
pixelShader
);
This
->
pixelShader
=
targetStateBlock
->
pixelShader
;
}
TRACE
(
"Updating texturestage state %u, %u to %u (was %u).
\n
"
,
stage
,
state
,
targetStateBlock
->
textureState
[
stage
][
state
],
This
->
textureState
[
stage
][
state
]);
record_lights
(
This
,
targetStateBlock
);
}
else
if
(
This
->
blockType
==
WINED3DSBT_ALL
)
{
memcpy
(
This
->
vertexShaderConstantB
,
targetStateBlock
->
vertexShaderConstantB
,
sizeof
(
This
->
vertexShaderConstantI
));
memcpy
(
This
->
vertexShaderConstantI
,
targetStateBlock
->
vertexShaderConstantI
,
sizeof
(
This
->
vertexShaderConstantF
));
memcpy
(
This
->
vertexShaderConstantF
,
targetStateBlock
->
vertexShaderConstantF
,
sizeof
(
float
)
*
GL_LIMITS
(
vshader_constantsF
)
*
4
);
This
->
gl_primitive_type
=
targetStateBlock
->
gl_primitive_type
;
memcpy
(
This
->
streamStride
,
targetStateBlock
->
streamStride
,
sizeof
(
This
->
streamStride
));
memcpy
(
This
->
streamOffset
,
targetStateBlock
->
streamOffset
,
sizeof
(
This
->
streamOffset
));
memcpy
(
This
->
streamFreq
,
targetStateBlock
->
streamFreq
,
sizeof
(
This
->
streamFreq
));
memcpy
(
This
->
streamFlags
,
targetStateBlock
->
streamFlags
,
sizeof
(
This
->
streamFlags
));
This
->
baseVertexIndex
=
targetStateBlock
->
baseVertexIndex
;
memcpy
(
This
->
transforms
,
targetStateBlock
->
transforms
,
sizeof
(
This
->
transforms
));
record_lights
(
This
,
targetStateBlock
);
memcpy
(
This
->
clipplane
,
targetStateBlock
->
clipplane
,
sizeof
(
This
->
clipplane
));
This
->
clip_status
=
targetStateBlock
->
clip_status
;
This
->
viewport
=
targetStateBlock
->
viewport
;
This
->
material
=
targetStateBlock
->
material
;
memcpy
(
This
->
pixelShaderConstantB
,
targetStateBlock
->
pixelShaderConstantB
,
sizeof
(
This
->
pixelShaderConstantI
));
memcpy
(
This
->
pixelShaderConstantI
,
targetStateBlock
->
pixelShaderConstantI
,
sizeof
(
This
->
pixelShaderConstantF
));
memcpy
(
This
->
pixelShaderConstantF
,
targetStateBlock
->
pixelShaderConstantF
,
sizeof
(
float
)
*
GL_LIMITS
(
pshader_constantsF
)
*
4
);
memcpy
(
This
->
renderState
,
targetStateBlock
->
renderState
,
sizeof
(
This
->
renderState
));
memcpy
(
This
->
textureState
,
targetStateBlock
->
textureState
,
sizeof
(
This
->
textureState
));
memcpy
(
This
->
samplerState
,
targetStateBlock
->
samplerState
,
sizeof
(
This
->
samplerState
));
This
->
scissorRect
=
targetStateBlock
->
scissorRect
;
if
(
This
->
vertexDecl
!=
targetStateBlock
->
vertexDecl
)
{
if
(
targetStateBlock
->
vertexDecl
)
IWineD3DVertexDeclaration_AddRef
(
targetStateBlock
->
vertexDecl
);
if
(
This
->
vertexDecl
)
IWineD3DVertexDeclaration_Release
(
This
->
vertexDecl
);
This
->
vertexDecl
=
targetStateBlock
->
vertexDecl
;
}
This
->
textureState
[
stage
][
state
]
=
targetStateBlock
->
textureState
[
stage
][
state
];
}
for
(
i
=
0
;
i
<
MAX_COMBINED_SAMPLERS
;
++
i
)
{
if
(
targetStateBlock
->
textures
[
i
]
!=
This
->
textures
[
i
])
{
if
(
targetStateBlock
->
textures
[
i
])
IWineD3DBaseTexture_AddRef
(
targetStateBlock
->
textures
[
i
]);
if
(
This
->
textures
[
i
])
IWineD3DBaseTexture_Release
(
This
->
textures
[
i
]);
This
->
textures
[
i
]
=
targetStateBlock
->
textures
[
i
];
}
}
/* Samplers */
map
=
This
->
changed
.
textures
;
for
(
i
=
0
;
map
;
map
>>=
1
,
++
i
)
{
if
(
!
(
map
&
1
))
continue
;
if
(
targetStateBlock
->
pIndexData
!=
This
->
pIndexData
||
targetStateBlock
->
IndexFmt
!=
This
->
IndexFmt
)
{
if
(
targetStateBlock
->
pIndexData
)
IWineD3DBuffer_AddRef
(
targetStateBlock
->
pIndexData
);
if
(
This
->
pIndexData
)
IWineD3DBuffer_Release
(
This
->
pIndexData
);
This
->
pIndexData
=
targetStateBlock
->
pIndexData
;
This
->
IndexFmt
=
targetStateBlock
->
IndexFmt
;
}
for
(
i
=
0
;
i
<
MAX_STREAMS
;
i
++
)
{
if
(
targetStateBlock
->
streamSource
[
i
]
!=
This
->
streamSource
[
i
])
{
if
(
targetStateBlock
->
streamSource
[
i
])
IWineD3DBuffer_AddRef
(
targetStateBlock
->
streamSource
[
i
]);
if
(
This
->
streamSource
[
i
])
IWineD3DBuffer_Release
(
This
->
streamSource
[
i
]);
This
->
streamSource
[
i
]
=
targetStateBlock
->
streamSource
[
i
];
}
}
if
(
This
->
vertexShader
!=
targetStateBlock
->
vertexShader
)
{
if
(
targetStateBlock
->
vertexShader
)
IWineD3DVertexShader_AddRef
(
targetStateBlock
->
vertexShader
);
if
(
This
->
vertexShader
)
IWineD3DVertexShader_Release
(
This
->
vertexShader
);
This
->
vertexShader
=
targetStateBlock
->
vertexShader
;
}
if
(
This
->
pixelShader
!=
targetStateBlock
->
pixelShader
)
{
if
(
targetStateBlock
->
pixelShader
)
IWineD3DPixelShader_AddRef
(
targetStateBlock
->
pixelShader
);
if
(
This
->
pixelShader
)
IWineD3DPixelShader_Release
(
This
->
pixelShader
);
This
->
pixelShader
=
targetStateBlock
->
pixelShader
;
}
}
else
if
(
This
->
blockType
==
WINED3DSBT_VERTEXSTATE
)
{
memcpy
(
This
->
vertexShaderConstantB
,
targetStateBlock
->
vertexShaderConstantB
,
sizeof
(
This
->
vertexShaderConstantI
));
memcpy
(
This
->
vertexShaderConstantI
,
targetStateBlock
->
vertexShaderConstantI
,
sizeof
(
This
->
vertexShaderConstantF
));
memcpy
(
This
->
vertexShaderConstantF
,
targetStateBlock
->
vertexShaderConstantF
,
sizeof
(
float
)
*
GL_LIMITS
(
vshader_constantsF
)
*
4
);
record_lights
(
This
,
targetStateBlock
);
for
(
i
=
0
;
i
<
sizeof
(
vertex_states_render
)
/
sizeof
(
*
vertex_states_render
);
++
i
)
{
This
->
renderState
[
vertex_states_render
[
i
]]
=
targetStateBlock
->
renderState
[
vertex_states_render
[
i
]];
}
for
(
j
=
0
;
j
<
MAX_COMBINED_SAMPLERS
;
j
++
)
{
for
(
i
=
0
;
i
<
sizeof
(
vertex_states_sampler
)
/
sizeof
(
*
vertex_states_sampler
);
++
i
)
{
This
->
samplerState
[
j
][
vertex_states_sampler
[
i
]]
=
targetStateBlock
->
samplerState
[
j
][
vertex_states_sampler
[
i
]];
}
}
for
(
j
=
0
;
j
<
MAX_TEXTURES
;
j
++
)
{
for
(
i
=
0
;
i
<
sizeof
(
vertex_states_render
)
/
sizeof
(
*
vertex_states_render
);
++
i
)
{
This
->
textureState
[
j
][
vertex_states_render
[
i
]]
=
targetStateBlock
->
textureState
[
j
][
vertex_states_render
[
i
]];
}
}
for
(
i
=
0
;
i
<
MAX_STREAMS
;
i
++
)
{
if
(
targetStateBlock
->
streamSource
[
i
]
!=
This
->
streamSource
[
i
])
{
if
(
targetStateBlock
->
streamSource
[
i
])
IWineD3DBuffer_AddRef
(
targetStateBlock
->
streamSource
[
i
]);
if
(
This
->
streamSource
[
i
])
IWineD3DBuffer_Release
(
This
->
streamSource
[
i
]);
This
->
streamSource
[
i
]
=
targetStateBlock
->
streamSource
[
i
];
}
}
if
(
This
->
vertexDecl
!=
targetStateBlock
->
vertexDecl
)
{
if
(
targetStateBlock
->
vertexDecl
)
IWineD3DVertexDeclaration_AddRef
(
targetStateBlock
->
vertexDecl
);
if
(
This
->
vertexDecl
)
IWineD3DVertexDeclaration_Release
(
This
->
vertexDecl
);
This
->
vertexDecl
=
targetStateBlock
->
vertexDecl
;
}
if
(
This
->
vertexShader
!=
targetStateBlock
->
vertexShader
)
{
if
(
targetStateBlock
->
vertexShader
)
IWineD3DVertexShader_AddRef
(
targetStateBlock
->
vertexShader
);
if
(
This
->
vertexShader
)
IWineD3DVertexShader_Release
(
This
->
vertexShader
);
This
->
vertexShader
=
targetStateBlock
->
vertexShader
;
}
}
else
if
(
This
->
blockType
==
WINED3DSBT_PIXELSTATE
)
{
memcpy
(
This
->
pixelShaderConstantB
,
targetStateBlock
->
pixelShaderConstantB
,
sizeof
(
This
->
pixelShaderConstantI
));
memcpy
(
This
->
pixelShaderConstantI
,
targetStateBlock
->
pixelShaderConstantI
,
sizeof
(
This
->
pixelShaderConstantF
));
memcpy
(
This
->
pixelShaderConstantF
,
targetStateBlock
->
pixelShaderConstantF
,
sizeof
(
float
)
*
GL_LIMITS
(
pshader_constantsF
)
*
4
);
for
(
i
=
0
;
i
<
sizeof
(
pixel_states_render
)
/
sizeof
(
*
pixel_states_render
);
++
i
)
{
This
->
renderState
[
pixel_states_render
[
i
]]
=
targetStateBlock
->
renderState
[
pixel_states_render
[
i
]];
}
for
(
j
=
0
;
j
<
MAX_COMBINED_SAMPLERS
;
j
++
)
{
for
(
i
=
0
;
i
<
sizeof
(
pixel_states_sampler
)
/
sizeof
(
*
pixel_states_sampler
);
++
i
)
{
This
->
samplerState
[
j
][
pixel_states_sampler
[
i
]]
=
targetStateBlock
->
samplerState
[
j
][
pixel_states_sampler
[
i
]];
}
}
for
(
j
=
0
;
j
<
MAX_TEXTURES
;
j
++
)
{
for
(
i
=
0
;
i
<
sizeof
(
pixel_states_render
)
/
sizeof
(
*
pixel_states_render
);
++
i
)
{
This
->
textureState
[
j
][
pixel_states_render
[
i
]]
=
targetStateBlock
->
textureState
[
j
][
pixel_states_render
[
i
]];
}
}
if
(
This
->
pixelShader
!=
targetStateBlock
->
pixelShader
)
{
if
(
targetStateBlock
->
pixelShader
)
IWineD3DPixelShader_AddRef
(
targetStateBlock
->
pixelShader
);
if
(
This
->
pixelShader
)
IWineD3DPixelShader_Release
(
This
->
pixelShader
);
This
->
pixelShader
=
targetStateBlock
->
pixelShader
;
}
TRACE
(
"Updating texture %u to %p (was %p).
\n
"
,
i
,
targetStateBlock
->
textures
[
i
],
This
->
textures
[
i
]);
if
(
targetStateBlock
->
textures
[
i
])
IWineD3DBaseTexture_AddRef
(
targetStateBlock
->
textures
[
i
]);
if
(
This
->
textures
[
i
])
IWineD3DBaseTexture_Release
(
This
->
textures
[
i
]);
This
->
textures
[
i
]
=
targetStateBlock
->
textures
[
i
];
}
for
(
i
=
0
;
i
<
This
->
num_contained_sampler_states
;
++
i
)
{
DWORD
stage
=
This
->
contained_sampler_states
[
i
].
stage
;
DWORD
state
=
This
->
contained_sampler_states
[
i
].
state
;
TRACE
(
"Updating sampler state %u, %u to %u (was %u).
\n
"
,
stage
,
state
,
targetStateBlock
->
samplerState
[
stage
][
state
],
This
->
samplerState
[
stage
][
state
]);
This
->
samplerState
[
stage
][
state
]
=
targetStateBlock
->
samplerState
[
stage
][
state
];
}
if
(
This
->
changed
.
pixelShader
&&
This
->
pixelShader
!=
targetStateBlock
->
pixelShader
)
{
if
(
targetStateBlock
->
pixelShader
)
IWineD3DPixelShader_AddRef
(
targetStateBlock
->
pixelShader
);
if
(
This
->
pixelShader
)
IWineD3DPixelShader_Release
(
This
->
pixelShader
);
This
->
pixelShader
=
targetStateBlock
->
pixelShader
;
}
record_lights
(
This
,
targetStateBlock
);
TRACE
(
"(%p) : Updated state block %p ------------------^
\n
"
,
targetStateBlock
,
This
);
return
WINED3D_OK
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment