Fix regressions in the unit tests related to setting gl_PointSize, and using other draw modes.

This had two regressions, using gl_PointSize and drawing triangles, and drawing points and triangles with the same binary program. TRAC #22526 Signed-off-by: Nicolas Capens Signed-off-by: Shannon Woods Author: Jamie Madill git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1853 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 43db7955
...@@ -59,6 +59,7 @@ Context::Context(const gl::Context *shareContext, rx::Renderer *renderer, bool n ...@@ -59,6 +59,7 @@ Context::Context(const gl::Context *shareContext, rx::Renderer *renderer, bool n
mState.rasterizer.polygonOffsetFill = false; mState.rasterizer.polygonOffsetFill = false;
mState.rasterizer.polygonOffsetFactor = 0.0f; mState.rasterizer.polygonOffsetFactor = 0.0f;
mState.rasterizer.polygonOffsetUnits = 0.0f; mState.rasterizer.polygonOffsetUnits = 0.0f;
mState.rasterizer.pointDrawMode = false;
mState.scissorTest = false; mState.scissorTest = false;
mState.scissor.x = 0; mState.scissor.x = 0;
mState.scissor.y = 0; mState.scissor.y = 0;
...@@ -1712,17 +1713,8 @@ bool Context::applyRenderTarget(GLenum drawMode, bool ignoreViewport) ...@@ -1712,17 +1713,8 @@ bool Context::applyRenderTarget(GLenum drawMode, bool ignoreViewport)
// Applies the fixed-function state (culling, depth test, alpha blending, stenciling, etc) to the Direct3D 9 device // Applies the fixed-function state (culling, depth test, alpha blending, stenciling, etc) to the Direct3D 9 device
void Context::applyState(GLenum drawMode) void Context::applyState(GLenum drawMode)
{ {
// disable face culling for point sprite emulation (done as geometry shader quads) mState.rasterizer.pointDrawMode = (drawMode == GL_POINTS);
if (getCurrentProgramBinary()->usesPointSpriteEmulation()) mRenderer->setRasterizerState(mState.rasterizer);
{
RasterizerState rasterizerStateCopy = mState.rasterizer;
rasterizerStateCopy.cullFace = false;
mRenderer->setRasterizerState(rasterizerStateCopy);
}
else
{
mRenderer->setRasterizerState(mState.rasterizer);
}
unsigned int mask = 0; unsigned int mask = 0;
if (mState.sampleCoverage) if (mState.sampleCoverage)
......
...@@ -55,6 +55,8 @@ struct RasterizerState ...@@ -55,6 +55,8 @@ struct RasterizerState
bool polygonOffsetFill; bool polygonOffsetFill;
GLfloat polygonOffsetFactor; GLfloat polygonOffsetFactor;
GLfloat polygonOffsetUnits; GLfloat polygonOffsetUnits;
bool pointDrawMode;
}; };
struct BlendState struct BlendState
......
...@@ -213,9 +213,17 @@ ID3D11RasterizerState *RenderStateCache::getRasterizerState(const gl::Rasterizer ...@@ -213,9 +213,17 @@ ID3D11RasterizerState *RenderStateCache::getRasterizerState(const gl::Rasterizer
mRasterizerStateCache.erase(leastRecentlyUsed); mRasterizerStateCache.erase(leastRecentlyUsed);
} }
D3D11_CULL_MODE cullMode = gl_d3d11::ConvertCullMode(rasterState.cullFace, rasterState.cullMode);
// Disable culling if drawing points
if (rasterState.pointDrawMode)
{
cullMode = D3D11_CULL_NONE;
}
D3D11_RASTERIZER_DESC rasterDesc; D3D11_RASTERIZER_DESC rasterDesc;
rasterDesc.FillMode = D3D11_FILL_SOLID; rasterDesc.FillMode = D3D11_FILL_SOLID;
rasterDesc.CullMode = gl_d3d11::ConvertCullMode(rasterState.cullFace, rasterState.cullMode); rasterDesc.CullMode = cullMode;
rasterDesc.FrontCounterClockwise = (rasterState.frontFace == GL_CCW) ? FALSE: TRUE; rasterDesc.FrontCounterClockwise = (rasterState.frontFace == GL_CCW) ? FALSE: TRUE;
rasterDesc.DepthBias = ldexp(rasterState.polygonOffsetUnits, -static_cast<int>(depthSize)); rasterDesc.DepthBias = ldexp(rasterState.polygonOffsetUnits, -static_cast<int>(depthSize));
rasterDesc.DepthBiasClamp = 0.0f; // MSDN documentation of DepthBiasClamp implies a value of zero will preform no clamping, must be tested though. rasterDesc.DepthBiasClamp = 0.0f; // MSDN documentation of DepthBiasClamp implies a value of zero will preform no clamping, must be tested though.
......
...@@ -101,6 +101,8 @@ Renderer11::Renderer11(egl::Display *display, HDC hDc) : Renderer(display), mDc( ...@@ -101,6 +101,8 @@ Renderer11::Renderer11(egl::Display *display, HDC hDc) : Renderer(display), mDc(
mDriverConstantBufferPS = NULL; mDriverConstantBufferPS = NULL;
mBGRATextureSupport = false; mBGRATextureSupport = false;
mIsGeometryShaderActive = false;
} }
Renderer11::~Renderer11() Renderer11::~Renderer11()
...@@ -1096,7 +1098,6 @@ void Renderer11::applyShaders(gl::ProgramBinary *programBinary) ...@@ -1096,7 +1098,6 @@ void Renderer11::applyShaders(gl::ProgramBinary *programBinary)
{ {
ShaderExecutable *vertexExe = programBinary->getVertexExecutable(); ShaderExecutable *vertexExe = programBinary->getVertexExecutable();
ShaderExecutable *pixelExe = programBinary->getPixelExecutable(); ShaderExecutable *pixelExe = programBinary->getPixelExecutable();
ShaderExecutable *geometryExe = programBinary->getGeometryExecutable();
ID3D11VertexShader *vertexShader = NULL; ID3D11VertexShader *vertexShader = NULL;
if (vertexExe) vertexShader = ShaderExecutable11::makeShaderExecutable11(vertexExe)->getVertexShader(); if (vertexExe) vertexShader = ShaderExecutable11::makeShaderExecutable11(vertexExe)->getVertexShader();
...@@ -1104,14 +1105,23 @@ void Renderer11::applyShaders(gl::ProgramBinary *programBinary) ...@@ -1104,14 +1105,23 @@ void Renderer11::applyShaders(gl::ProgramBinary *programBinary)
ID3D11PixelShader *pixelShader = NULL; ID3D11PixelShader *pixelShader = NULL;
if (pixelExe) pixelShader = ShaderExecutable11::makeShaderExecutable11(pixelExe)->getPixelShader(); if (pixelExe) pixelShader = ShaderExecutable11::makeShaderExecutable11(pixelExe)->getPixelShader();
ID3D11GeometryShader *geometryShader = NULL;
if (geometryExe) geometryShader = ShaderExecutable11::makeShaderExecutable11(geometryExe)->getGeometryShader();
mDeviceContext->PSSetShader(pixelShader, NULL, 0); mDeviceContext->PSSetShader(pixelShader, NULL, 0);
mDeviceContext->VSSetShader(vertexShader, NULL, 0); mDeviceContext->VSSetShader(vertexShader, NULL, 0);
if (geometryShader) programBinary->dirtyAllUniforms();
mAppliedProgramBinarySerial = programBinarySerial;
}
// Only use the geometry shader currently for point sprite drawing
const bool usesGeometryShader = programBinary->usesGeometryShader() && mCurRasterState.pointDrawMode;
if (programBinarySerial != mAppliedProgramBinarySerial || usesGeometryShader != mIsGeometryShaderActive)
{
if (usesGeometryShader)
{ {
ShaderExecutable *geometryExe = programBinary->getGeometryExecutable();
ID3D11GeometryShader *geometryShader = ShaderExecutable11::makeShaderExecutable11(geometryExe)->getGeometryShader();
mDeviceContext->GSSetShader(geometryShader, NULL, 0); mDeviceContext->GSSetShader(geometryShader, NULL, 0);
} }
else else
...@@ -1119,9 +1129,7 @@ void Renderer11::applyShaders(gl::ProgramBinary *programBinary) ...@@ -1119,9 +1129,7 @@ void Renderer11::applyShaders(gl::ProgramBinary *programBinary)
mDeviceContext->GSSetShader(NULL, NULL, 0); mDeviceContext->GSSetShader(NULL, NULL, 0);
} }
programBinary->dirtyAllUniforms(); mIsGeometryShaderActive = usesGeometryShader;
mAppliedProgramBinarySerial = programBinarySerial;
} }
} }
......
...@@ -251,6 +251,7 @@ class Renderer11 : public Renderer ...@@ -251,6 +251,7 @@ class Renderer11 : public Renderer
unsigned int mAppliedIBOffset; unsigned int mAppliedIBOffset;
unsigned int mAppliedProgramBinarySerial; unsigned int mAppliedProgramBinarySerial;
bool mIsGeometryShaderActive;
dx_VertexConstants mVertexConstants; dx_VertexConstants mVertexConstants;
dx_VertexConstants mAppliedVertexConstants; dx_VertexConstants mAppliedVertexConstants;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment