Compiler - implement gl_FrontFacing

TRAC #11368
Signed-off-by: Andrew Lewycky
Signed-off-by: Daniel Koch
From:    Nicolas Capens <nicolas@transgaming.com>

git-svn-id: https://angleproject.googlecode.com/svn/trunk@22 736b8ea6-26fd-11df-bfd4-992fa37f6226
This commit is contained in:
daniel@transgaming.com 2010-03-16 05:48:57 +00:00
Родитель 9b5f5443d6
Коммит 79b820b73a
2 изменённых файлов: 17 добавлений и 8 удалений

Просмотреть файл

@ -58,13 +58,15 @@ void OutputHLSL::header()
out << "uniform float4 gl_Window;\n" out << "uniform float4 gl_Window;\n"
"uniform float2 gl_Depth;\n" "uniform float2 gl_Depth;\n"
"uniform bool __frontCCW;\n"
"\n"; "\n";
out << uniforms; out << uniforms;
out << "\n" out << "\n"
"struct PS_INPUT\n" // FIXME: Prevent name clashes "struct PS_INPUT\n" // FIXME: Prevent name clashes
"{\n"; "{\n";
out << varyingInput; out << varyingInput;
out << " float4 gl_FragCoord : TEXCOORD" << HLSL_FRAG_COORD_SEMANTIC << ";\n" out << " float4 gl_FragCoord : TEXCOORD" << HLSL_FRAG_COORD_SEMANTIC << ";\n";
out << " float __vFace : VFACE;\n"
"};\n" "};\n"
"\n"; "\n";
out << varyingGlobals; out << varyingGlobals;
@ -76,6 +78,7 @@ void OutputHLSL::header()
"\n" "\n"
"static float4 gl_Color[1] = {float4(0, 0, 0, 0)};\n" "static float4 gl_Color[1] = {float4(0, 0, 0, 0)};\n"
"static float4 gl_FragCoord = float4(0, 0, 0, 0);\n" "static float4 gl_FragCoord = float4(0, 0, 0, 0);\n"
"static bool gl_FrontFacing = false;\n"
"\n" "\n"
"float4 gl_texture2D(sampler2D s, float2 t)\n" "float4 gl_texture2D(sampler2D s, float2 t)\n"
"{\n" "{\n"
@ -635,7 +638,8 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node)
" gl_FragCoord.x = (input.gl_FragCoord.x * rhw) * gl_Window.x + gl_Window.z;\n" " gl_FragCoord.x = (input.gl_FragCoord.x * rhw) * gl_Window.x + gl_Window.z;\n"
" gl_FragCoord.y = (input.gl_FragCoord.y * rhw) * gl_Window.y + gl_Window.w;\n" " gl_FragCoord.y = (input.gl_FragCoord.y * rhw) * gl_Window.y + gl_Window.w;\n"
" gl_FragCoord.z = (input.gl_FragCoord.z * rhw) * gl_Depth.x + gl_Depth.y;\n" " gl_FragCoord.z = (input.gl_FragCoord.z * rhw) * gl_Depth.x + gl_Depth.y;\n"
" gl_FragCoord.w = rhw;\n"; " gl_FragCoord.w = rhw;\n"
" gl_FrontFacing = __frontCCW ? (input.__vFace >= 0.0) : (input.__vFace <= 0.0);\n";
for (TSymbolTableLevel::const_iterator namedSymbol = symbols->begin(); namedSymbol != symbols->end(); namedSymbol++) for (TSymbolTableLevel::const_iterator namedSymbol = symbols->begin(); namedSymbol != symbols->end(); namedSymbol++)
{ {

Просмотреть файл

@ -792,25 +792,25 @@ bool Context::applyRenderTarget(bool ignoreViewport)
renderTarget->GetDesc(&description); renderTarget->GetDesc(&description);
Program *programObject = getCurrentProgram(); Program *programObject = getCurrentProgram();
GLuint halfPixelSize = programObject->getUniformLocation("gl_HalfPixelSize"); GLint halfPixelSize = programObject->getUniformLocation("gl_HalfPixelSize");
GLfloat xy[2] = {1.0f / description.Width, 1.0f / description.Height}; GLfloat xy[2] = {1.0f / description.Width, 1.0f / description.Height};
programObject->setUniform2fv(halfPixelSize, 1, (GLfloat*)&xy); programObject->setUniform2fv(halfPixelSize, 1, (GLfloat*)&xy);
GLuint window = programObject->getUniformLocation("gl_Window"); GLint window = programObject->getUniformLocation("gl_Window");
GLfloat whxy[4] = {viewportWidth / 2.0f, viewportHeight / 2.0f, (float)viewportX + viewportWidth / 2.0f, (float)viewportY + viewportHeight / 2.0f}; GLfloat whxy[4] = {viewportWidth / 2.0f, viewportHeight / 2.0f, (float)viewportX + viewportWidth / 2.0f, (float)viewportY + viewportHeight / 2.0f};
programObject->setUniform4fv(window, 1, (GLfloat*)&whxy); programObject->setUniform4fv(window, 1, (GLfloat*)&whxy);
GLuint depth = programObject->getUniformLocation("gl_Depth"); GLint depth = programObject->getUniformLocation("gl_Depth");
GLfloat dz[2] = {(zFar - zNear) / 2.0f, (zNear + zFar) / 2.0f}; GLfloat dz[2] = {(zFar - zNear) / 2.0f, (zNear + zFar) / 2.0f};
programObject->setUniform2fv(depth, 1, (GLfloat*)&dz); programObject->setUniform2fv(depth, 1, (GLfloat*)&dz);
GLuint near = programObject->getUniformLocation("gl_DepthRange.near"); GLint near = programObject->getUniformLocation("gl_DepthRange.near");
programObject->setUniform1fv(near, 1, &zNear); programObject->setUniform1fv(near, 1, &zNear);
GLuint far = programObject->getUniformLocation("gl_DepthRange.far"); GLint far = programObject->getUniformLocation("gl_DepthRange.far");
programObject->setUniform1fv(far, 1, &zFar); programObject->setUniform1fv(far, 1, &zFar);
GLuint diff = programObject->getUniformLocation("gl_DepthRange.diff"); GLint diff = programObject->getUniformLocation("gl_DepthRange.diff");
GLfloat zDiff = zFar - zNear; GLfloat zDiff = zFar - zNear;
programObject->setUniform1fv(diff, 1, &zDiff); programObject->setUniform1fv(diff, 1, &zDiff);
} }
@ -822,6 +822,11 @@ bool Context::applyRenderTarget(bool ignoreViewport)
void Context::applyState() void Context::applyState()
{ {
IDirect3DDevice9 *device = getDevice(); IDirect3DDevice9 *device = getDevice();
Program *programObject = getCurrentProgram();
GLint frontCCW = programObject->getUniformLocation("__frontCCW");
GLint ccw = (frontFace == GL_CCW);
programObject->setUniform1iv(frontCCW, 1, &ccw);
if (cullFace) if (cullFace)
{ {