wined3d: Replace the position fixup mul-add-add with a MAD.
This commit is contained in:
parent
6209b36acb
commit
c7c785861a
|
@ -2642,6 +2642,7 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
|
||||||
} else {
|
} else {
|
||||||
object->surface_alignment = 4;
|
object->surface_alignment = 4;
|
||||||
}
|
}
|
||||||
|
object->posFixup[0] = 1.0; /* This is needed to get the x coord unmodified through a MAD */
|
||||||
|
|
||||||
/* Set the state up as invalid until the device is fully created */
|
/* Set the state up as invalid until the device is fully created */
|
||||||
object->state = WINED3DERR_DRIVERINTERNALERROR;
|
object->state = WINED3DERR_DRIVERINTERNALERROR;
|
||||||
|
|
|
@ -337,16 +337,12 @@ static VOID IWineD3DVertexShaderImpl_GenerateShader(
|
||||||
/* Write the final position.
|
/* Write the final position.
|
||||||
*
|
*
|
||||||
* OpenGL coordinates specify the center of the pixel while d3d coords specify
|
* OpenGL coordinates specify the center of the pixel while d3d coords specify
|
||||||
* the corner. The offsets are stored in z and w in the 2nd row of the projection
|
* the corner. The offsets are stored in z and w in posFixup. posFixup.y contains
|
||||||
* matrix to avoid wasting a free shader constant. Add them to the w and z coord
|
* 1.0 or -1.0 to turn the rendering upside down for offscreen rendering. PosFixup.x
|
||||||
* of the 2nd row
|
* contains 1.0 to allow a mad.
|
||||||
*/
|
*/
|
||||||
shader_addline(&buffer, "gl_Position.x = gl_Position.x + posFixup[2];\n");
|
shader_addline(&buffer, "gl_Position.xy = gl_Position.xy * posFixup.xy + posFixup.zw;\n");
|
||||||
shader_addline(&buffer, "gl_Position.y = gl_Position.y + posFixup[3];\n");
|
|
||||||
/* Account for any inverted textures (render to texture case) by reversing the y coordinate
|
|
||||||
* (this is handled in drawPrim() when it sets the MODELVIEW and PROJECTION matrices)
|
|
||||||
*/
|
|
||||||
shader_addline(&buffer, "gl_Position.y = gl_Position.y * posFixup[1];\n");
|
|
||||||
/* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c
|
/* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c
|
||||||
*
|
*
|
||||||
* Basically we want(in homogenous coordinates) z = z * 2 - 1. However, shaders are run
|
* Basically we want(in homogenous coordinates) z = z * 2 - 1. However, shaders are run
|
||||||
|
@ -399,15 +395,13 @@ static VOID IWineD3DVertexShaderImpl_GenerateShader(
|
||||||
/* Write the final position.
|
/* Write the final position.
|
||||||
*
|
*
|
||||||
* OpenGL coordinates specify the center of the pixel while d3d coords specify
|
* OpenGL coordinates specify the center of the pixel while d3d coords specify
|
||||||
* the corner. The offsets are stored in the 2nd row of the projection matrix,
|
* the corner. The offsets are stored in z and w in posFixup. posFixup.y contains
|
||||||
* the x offset in z and the y offset in w. Add them to the resulting position
|
* 1.0 or -1.0 to turn the rendering upside down for offscreen rendering. PosFixup.x
|
||||||
|
* contains 1.0 to allow a mad, but arb vs swizzles are too restricted for that.
|
||||||
*/
|
*/
|
||||||
shader_addline(&buffer, "ADD TMP_OUT.x, TMP_OUT.x, posFixup.z;\n");
|
shader_addline(&buffer, "ADD TMP_OUT.x, TMP_OUT.x, posFixup.z;");
|
||||||
shader_addline(&buffer, "ADD TMP_OUT.y, TMP_OUT.y, posFixup.w;\n");
|
shader_addline(&buffer, "MAD TMP_OUT.y, TMP_OUT.y, posFixup.y, posFixup.w;");
|
||||||
/* Account for any inverted textures (render to texture case) by reversing the y coordinate
|
|
||||||
* (this is handled in drawPrim() when it sets the MODELVIEW and PROJECTION matrices)
|
|
||||||
*/
|
|
||||||
shader_addline(&buffer, "MUL TMP_OUT.y, TMP_OUT.y, posFixup.y;\n");
|
|
||||||
/* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c
|
/* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c
|
||||||
* and the glsl equivalent
|
* and the glsl equivalent
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue