Commit de8892b4 by Jamie Madill

Pass GL caps and version to compiler.

This allows us to get rid of some of the reliance on storing the current context client version in the Renderer. A subsequent patch will allow us to remove the client version ugly hack. BUG=angle:789 Change-Id: I139e0f66e1d39e5cd41a484c841a7101b1f29540 Reviewed-on: https://chromium-review.googlesource.com/227712Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 87f6da1f
...@@ -658,7 +658,7 @@ Error Context::linkProgram(GLuint program) ...@@ -658,7 +658,7 @@ Error Context::linkProgram(GLuint program)
{ {
Program *programObject = mResourceManager->getProgram(program); Program *programObject = mResourceManager->getProgram(program);
Error error = programObject->link(getCaps()); Error error = programObject->link(getData());
if (error.isError()) if (error.isError())
{ {
return error; return error;
......
...@@ -244,7 +244,7 @@ void Program::bindAttributeLocation(GLuint index, const char *name) ...@@ -244,7 +244,7 @@ void Program::bindAttributeLocation(GLuint index, const char *name)
// Links the HLSL code of the vertex and pixel shader by matching up their varyings, // Links the HLSL code of the vertex and pixel shader by matching up their varyings,
// compiling them into binaries, determining the attribute mappings, and collecting // compiling them into binaries, determining the attribute mappings, and collecting
// a list of uniforms // a list of uniforms
Error Program::link(const Caps &caps) Error Program::link(const Data &data)
{ {
unlink(false); unlink(false);
...@@ -252,8 +252,8 @@ Error Program::link(const Caps &caps) ...@@ -252,8 +252,8 @@ Error Program::link(const Caps &caps)
resetUniformBlockBindings(); resetUniformBlockBindings();
mProgramBinary.set(new ProgramBinary(mRenderer->createProgram())); mProgramBinary.set(new ProgramBinary(mRenderer->createProgram()));
LinkResult result = mProgramBinary->link(mInfoLog, mAttributeBindings, mFragmentShader, mVertexShader, LinkResult result = mProgramBinary->link(data, mInfoLog, mAttributeBindings, mFragmentShader, mVertexShader,
mTransformFeedbackVaryings, mTransformFeedbackBufferMode, caps); mTransformFeedbackVaryings, mTransformFeedbackBufferMode);
if (result.error.isError()) if (result.error.isError())
{ {
return result.error; return result.error;
......
...@@ -29,6 +29,7 @@ class Renderer; ...@@ -29,6 +29,7 @@ class Renderer;
namespace gl namespace gl
{ {
struct Caps; struct Caps;
struct Data;
class ResourceManager; class ResourceManager;
class Shader; class Shader;
...@@ -77,7 +78,7 @@ class Program ...@@ -77,7 +78,7 @@ class Program
void bindAttributeLocation(GLuint index, const char *name); void bindAttributeLocation(GLuint index, const char *name);
Error link(const Caps &caps); Error link(const Data &data);
bool isLinked(); bool isLinked();
Error setProgramBinary(GLenum binaryFormat, const void *binary, GLsizei length); Error setProgramBinary(GLenum binaryFormat, const void *binary, GLsizei length);
ProgramBinary *getProgramBinary() const; ProgramBinary *getProgramBinary() const;
......
...@@ -495,8 +495,10 @@ GLint ProgramBinary::getLength() ...@@ -495,8 +495,10 @@ GLint ProgramBinary::getLength()
return length; return length;
} }
LinkResult ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attributeBindings, Shader *fragmentShader, Shader *vertexShader, LinkResult ProgramBinary::link(const Data &data, InfoLog &infoLog, const AttributeBindings &attributeBindings,
const std::vector<std::string>& transformFeedbackVaryings, GLenum transformFeedbackBufferMode, const Caps &caps) Shader *fragmentShader, Shader *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
GLenum transformFeedbackBufferMode)
{ {
if (!fragmentShader || !fragmentShader->isCompiled()) if (!fragmentShader || !fragmentShader->isCompiled())
{ {
...@@ -514,8 +516,8 @@ LinkResult ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attrib ...@@ -514,8 +516,8 @@ LinkResult ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attrib
int registers; int registers;
std::vector<LinkedVarying> linkedVaryings; std::vector<LinkedVarying> linkedVaryings;
LinkResult result = mProgram->link(infoLog, fragmentShader, vertexShader, transformFeedbackVaryings, transformFeedbackBufferMode, LinkResult result = mProgram->link(data, infoLog, fragmentShader, vertexShader, transformFeedbackVaryings, transformFeedbackBufferMode,
&registers, &linkedVaryings, &mOutputVariables, caps); &registers, &linkedVaryings, &mOutputVariables);
if (result.error.isError() || !result.linkSuccess) if (result.error.isError() || !result.linkSuccess)
{ {
return result; return result;
...@@ -526,18 +528,18 @@ LinkResult ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attrib ...@@ -526,18 +528,18 @@ LinkResult ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attrib
return LinkResult(false, Error(GL_NO_ERROR)); return LinkResult(false, Error(GL_NO_ERROR));
} }
if (!mProgram->linkUniforms(infoLog, *vertexShader, *fragmentShader, caps)) if (!mProgram->linkUniforms(infoLog, *vertexShader, *fragmentShader, *data.caps))
{ {
return LinkResult(false, Error(GL_NO_ERROR)); return LinkResult(false, Error(GL_NO_ERROR));
} }
if (!linkUniformBlocks(infoLog, *vertexShader, *fragmentShader, caps)) if (!linkUniformBlocks(infoLog, *vertexShader, *fragmentShader, *data.caps))
{ {
return LinkResult(false, Error(GL_NO_ERROR)); return LinkResult(false, Error(GL_NO_ERROR));
} }
if (!gatherTransformFeedbackLinkedVaryings(infoLog, linkedVaryings, transformFeedbackVaryings, if (!gatherTransformFeedbackLinkedVaryings(infoLog, linkedVaryings, transformFeedbackVaryings,
transformFeedbackBufferMode, &mProgram->getTransformFeedbackLinkedVaryings(), caps)) transformFeedbackBufferMode, &mProgram->getTransformFeedbackLinkedVaryings(), *data.caps))
{ {
return LinkResult(false, Error(GL_NO_ERROR)); return LinkResult(false, Error(GL_NO_ERROR));
} }
......
...@@ -52,6 +52,7 @@ class InfoLog; ...@@ -52,6 +52,7 @@ class InfoLog;
class AttributeBindings; class AttributeBindings;
class Buffer; class Buffer;
class Framebuffer; class Framebuffer;
struct Data;
// Struct used for correlating uniforms/elements of uniform arrays to handles // Struct used for correlating uniforms/elements of uniform arrays to handles
struct VariableLocation struct VariableLocation
...@@ -147,9 +148,10 @@ class ProgramBinary : public RefCountObject ...@@ -147,9 +148,10 @@ class ProgramBinary : public RefCountObject
Error save(GLenum *binaryFormat, void *binary, GLsizei bufSize, GLsizei *length); Error save(GLenum *binaryFormat, void *binary, GLsizei bufSize, GLsizei *length);
GLint getLength(); GLint getLength();
LinkResult link(InfoLog &infoLog, const AttributeBindings &attributeBindings, Shader *fragmentShader, Shader *vertexShader, LinkResult link(const Data &data, InfoLog &infoLog, const AttributeBindings &attributeBindings,
const std::vector<std::string>& transformFeedbackVaryings, GLenum transformFeedbackBufferMode, Shader *fragmentShader, Shader *vertexShader,
const Caps &caps); const std::vector<std::string> &transformFeedbackVaryings,
GLenum transformFeedbackBufferMode);
void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const; void getActiveAttribute(GLuint index, GLsizei bufsize, GLsizei *length, GLint *size, GLenum *type, GLchar *name) const;
GLint getActiveAttributeCount() const; GLint getActiveAttributeCount() const;
......
...@@ -55,10 +55,12 @@ class ProgramImpl ...@@ -55,10 +55,12 @@ class ProgramImpl
virtual gl::LinkResult load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) = 0; virtual gl::LinkResult load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) = 0;
virtual gl::Error save(gl::BinaryOutputStream *stream) = 0; virtual gl::Error save(gl::BinaryOutputStream *stream) = 0;
virtual gl::LinkResult link(gl::InfoLog &infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader, virtual gl::LinkResult link(const gl::Data &data, gl::InfoLog &infoLog,
const std::vector<std::string> &transformFeedbackVaryings, GLenum transformFeedbackBufferMode, gl::Shader *fragmentShader, gl::Shader *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
GLenum transformFeedbackBufferMode,
int *registers, std::vector<gl::LinkedVarying> *linkedVaryings, int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *outputVariables, const gl::Caps &caps) = 0; std::map<int, gl::VariableLocation> *outputVariables) = 0;
virtual void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) = 0; virtual void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) = 0;
virtual void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) = 0; virtual void setUniform2fv(GLint location, GLsizei count, const GLfloat *v) = 0;
......
...@@ -9,9 +9,9 @@ ...@@ -9,9 +9,9 @@
#include "libGLESv2/renderer/d3d/DynamicHLSL.h" #include "libGLESv2/renderer/d3d/DynamicHLSL.h"
#include "libGLESv2/renderer/d3d/ShaderD3D.h" #include "libGLESv2/renderer/d3d/ShaderD3D.h"
#include "libGLESv2/renderer/d3d/RendererD3D.h" #include "libGLESv2/renderer/d3d/RendererD3D.h"
#include "libGLESv2/Shader.h"
#include "libGLESv2/Program.h" #include "libGLESv2/Program.h"
#include "libGLESv2/ProgramBinary.h" #include "libGLESv2/ProgramBinary.h"
#include "libGLESv2/Shader.h"
#include "libGLESv2/formatutils.h" #include "libGLESv2/formatutils.h"
#include "common/utilities.h" #include "common/utilities.h"
...@@ -226,7 +226,7 @@ static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, Var ...@@ -226,7 +226,7 @@ static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, Var
// Packs varyings into generic varying registers, using the algorithm from [OpenGL ES Shading Language 1.00 rev. 17] appendix A section 7 page 111 // Packs varyings into generic varying registers, using the algorithm from [OpenGL ES Shading Language 1.00 rev. 17] appendix A section 7 page 111
// Returns the number of used varying registers, or -1 if unsuccesful // Returns the number of used varying registers, or -1 if unsuccesful
int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, rx::ShaderD3D *fragmentShader, int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, rx::ShaderD3D *fragmentShader,
rx::ShaderD3D *vertexShader, const std::vector<std::string>& transformFeedbackVaryings) rx::ShaderD3D *vertexShader, const std::vector<std::string> &transformFeedbackVaryings)
{ {
// TODO (geofflang): Use context's caps // TODO (geofflang): Use context's caps
const int maxVaryingVectors = mRenderer->getRendererCaps().maxVaryingVectors; const int maxVaryingVectors = mRenderer->getRendererCaps().maxVaryingVectors;
...@@ -669,10 +669,11 @@ void DynamicHLSL::storeUserLinkedVaryings(const rx::ShaderD3D *vertexShader, ...@@ -669,10 +669,11 @@ void DynamicHLSL::storeUserLinkedVaryings(const rx::ShaderD3D *vertexShader,
} }
} }
bool DynamicHLSL::generateShaderLinkHLSL(InfoLog &infoLog, int registers, const VaryingPacking packing, bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, InfoLog &infoLog, int registers,
std::string& pixelHLSL, std::string& vertexHLSL, const VaryingPacking packing,
std::string &pixelHLSL, std::string &vertexHLSL,
rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader, rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader,
const std::vector<std::string>& transformFeedbackVaryings, const std::vector<std::string> &transformFeedbackVaryings,
std::vector<LinkedVarying> *linkedVaryings, std::vector<LinkedVarying> *linkedVaryings,
std::map<int, VariableLocation> *programOutputVars, std::map<int, VariableLocation> *programOutputVars,
std::vector<PixelShaderOutputVariable> *outPixelShaderKey, std::vector<PixelShaderOutputVariable> *outPixelShaderKey,
...@@ -698,21 +699,17 @@ bool DynamicHLSL::generateShaderLinkHLSL(InfoLog &infoLog, int registers, const ...@@ -698,21 +699,17 @@ bool DynamicHLSL::generateShaderLinkHLSL(InfoLog &infoLog, int registers, const
// Write the HLSL input/output declarations // Write the HLSL input/output declarations
const int shaderModel = mRenderer->getMajorShaderModel(); const int shaderModel = mRenderer->getMajorShaderModel();
// TODO (geofflang): Use context's caps
const int maxVaryingVectors = mRenderer->getRendererCaps().maxVaryingVectors;
const int registersNeeded = registers + (usesFragCoord ? 1 : 0) + (usesPointCoord ? 1 : 0); const int registersNeeded = registers + (usesFragCoord ? 1 : 0) + (usesPointCoord ? 1 : 0);
// Two cases when writing to gl_FragColor and using ESSL 1.0: // Two cases when writing to gl_FragColor and using ESSL 1.0:
// - with a 3.0 context, the output color is copied to channel 0 // - with a 3.0 context, the output color is copied to channel 0
// - with a 2.0 context, the output color is broadcast to all channels // - with a 2.0 context, the output color is broadcast to all channels
const bool broadcast = (fragmentShader->mUsesFragColor && mRenderer->getCurrentClientVersion() < 3); const bool broadcast = (fragmentShader->mUsesFragColor && data.clientVersion < 3);
const unsigned int numRenderTargets = (broadcast || usesMRT ? mRenderer->getRendererCaps().maxDrawBuffers : 1); const unsigned int numRenderTargets = (broadcast || usesMRT ? data.caps->maxDrawBuffers : 1);
int shaderVersion = vertexShader->getShaderVersion(); int shaderVersion = vertexShader->getShaderVersion();
if (registersNeeded > maxVaryingVectors) if (static_cast<GLuint>(registersNeeded) > data.caps->maxVaryingVectors)
{ {
infoLog.append("No varying registers left to support gl_FragCoord/gl_PointCoord"); infoLog.append("No varying registers left to support gl_FragCoord/gl_PointCoord");
return false; return false;
...@@ -779,7 +776,7 @@ bool DynamicHLSL::generateShaderLinkHLSL(InfoLog &infoLog, int registers, const ...@@ -779,7 +776,7 @@ bool DynamicHLSL::generateShaderLinkHLSL(InfoLog &infoLog, int registers, const
for (int row = 0; row < variableRows; row++) for (int row = 0; row < variableRows; row++)
{ {
int r = varying.registerIndex + varying.columnIndex * mRenderer->getRendererCaps().maxVaryingVectors + elementIndex * variableRows + row; int r = varying.registerIndex + varying.columnIndex * data.caps->maxVaryingVectors + elementIndex * variableRows + row;
vertexHLSL += " output.v" + Str(r); vertexHLSL += " output.v" + Str(r);
vertexHLSL += " = _" + varying.name; vertexHLSL += " = _" + varying.name;
...@@ -927,7 +924,7 @@ bool DynamicHLSL::generateShaderLinkHLSL(InfoLog &infoLog, int registers, const ...@@ -927,7 +924,7 @@ bool DynamicHLSL::generateShaderLinkHLSL(InfoLog &infoLog, int registers, const
int variableRows = (varying.isStruct() ? 1 : VariableRowCount(transposedType)); int variableRows = (varying.isStruct() ? 1 : VariableRowCount(transposedType));
for (int row = 0; row < variableRows; row++) for (int row = 0; row < variableRows; row++)
{ {
std::string n = Str(varying.registerIndex + varying.columnIndex * mRenderer->getRendererCaps().maxVaryingVectors + elementIndex * variableRows + row); std::string n = Str(varying.registerIndex + varying.columnIndex * data.caps->maxVaryingVectors + elementIndex * variableRows + row);
pixelHLSL += " _" + varying.name; pixelHLSL += " _" + varying.name;
if (varying.isArray()) if (varying.isArray())
......
...@@ -31,6 +31,7 @@ struct LinkedVarying; ...@@ -31,6 +31,7 @@ struct LinkedVarying;
struct VertexAttribute; struct VertexAttribute;
struct VertexFormat; struct VertexFormat;
struct PackedVarying; struct PackedVarying;
struct Data;
} }
namespace rx namespace rx
...@@ -59,10 +60,11 @@ class DynamicHLSL ...@@ -59,10 +60,11 @@ class DynamicHLSL
const sh::Attribute shaderAttributes[]) const; const sh::Attribute shaderAttributes[]) const;
std::string generatePixelShaderForOutputSignature(const std::string &sourceShader, const std::vector<PixelShaderOutputVariable> &outputVariables, std::string generatePixelShaderForOutputSignature(const std::string &sourceShader, const std::vector<PixelShaderOutputVariable> &outputVariables,
bool usesFragDepth, const std::vector<GLenum> &outputLayout) const; bool usesFragDepth, const std::vector<GLenum> &outputLayout) const;
bool generateShaderLinkHLSL(gl::InfoLog &infoLog, int registers, const VaryingPacking packing, bool generateShaderLinkHLSL(const gl::Data &data, gl::InfoLog &infoLog, int registers,
std::string& pixelHLSL, std::string& vertexHLSL, const VaryingPacking packing,
std::string &pixelHLSL, std::string &vertexHLSL,
rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader, rx::ShaderD3D *fragmentShader, rx::ShaderD3D *vertexShader,
const std::vector<std::string>& transformFeedbackVaryings, const std::vector<std::string> &transformFeedbackVaryings,
std::vector<gl::LinkedVarying> *linkedVaryings, std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *programOutputVars, std::map<int, gl::VariableLocation> *programOutputVars,
std::vector<PixelShaderOutputVariable> *outPixelShaderKey, std::vector<PixelShaderOutputVariable> *outPixelShaderKey,
......
...@@ -980,16 +980,18 @@ gl::LinkResult ProgramD3D::compileProgramExecutables(gl::InfoLog &infoLog, gl::S ...@@ -980,16 +980,18 @@ gl::LinkResult ProgramD3D::compileProgramExecutables(gl::InfoLog &infoLog, gl::S
return gl::LinkResult(linkSuccess, gl::Error(GL_NO_ERROR)); return gl::LinkResult(linkSuccess, gl::Error(GL_NO_ERROR));
} }
gl::LinkResult ProgramD3D::link(gl::InfoLog &infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader, gl::LinkResult ProgramD3D::link(const gl::Data &data, gl::InfoLog &infoLog,
const std::vector<std::string> &transformFeedbackVaryings, GLenum transformFeedbackBufferMode, gl::Shader *fragmentShader, gl::Shader *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
GLenum transformFeedbackBufferMode,
int *registers, std::vector<gl::LinkedVarying> *linkedVaryings, int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *outputVariables, const gl::Caps &caps) std::map<int, gl::VariableLocation> *outputVariables)
{ {
ShaderD3D *vertexShaderD3D = ShaderD3D::makeShaderD3D(vertexShader->getImplementation()); ShaderD3D *vertexShaderD3D = ShaderD3D::makeShaderD3D(vertexShader->getImplementation());
ShaderD3D *fragmentShaderD3D = ShaderD3D::makeShaderD3D(fragmentShader->getImplementation()); ShaderD3D *fragmentShaderD3D = ShaderD3D::makeShaderD3D(fragmentShader->getImplementation());
mSamplersPS.resize(caps.maxTextureImageUnits); mSamplersPS.resize(data.caps->maxTextureImageUnits);
mSamplersVS.resize(caps.maxVertexTextureImageUnits); mSamplersVS.resize(data.caps->maxVertexTextureImageUnits);
mTransformFeedbackBufferMode = transformFeedbackBufferMode; mTransformFeedbackBufferMode = transformFeedbackBufferMode;
...@@ -1014,7 +1016,7 @@ gl::LinkResult ProgramD3D::link(gl::InfoLog &infoLog, gl::Shader *fragmentShader ...@@ -1014,7 +1016,7 @@ gl::LinkResult ProgramD3D::link(gl::InfoLog &infoLog, gl::Shader *fragmentShader
return gl::LinkResult(false, gl::Error(GL_NO_ERROR)); return gl::LinkResult(false, gl::Error(GL_NO_ERROR));
} }
if (!mDynamicHLSL->generateShaderLinkHLSL(infoLog, *registers, packing, mPixelHLSL, mVertexHLSL, if (!mDynamicHLSL->generateShaderLinkHLSL(data, infoLog, *registers, packing, mPixelHLSL, mVertexHLSL,
fragmentShaderD3D, vertexShaderD3D, transformFeedbackVaryings, fragmentShaderD3D, vertexShaderD3D, transformFeedbackVaryings,
linkedVaryings, outputVariables, &mPixelShaderKey, &mUsesFragDepth)) linkedVaryings, outputVariables, &mPixelShaderKey, &mUsesFragDepth))
{ {
......
...@@ -62,10 +62,12 @@ class ProgramD3D : public ProgramImpl ...@@ -62,10 +62,12 @@ class ProgramD3D : public ProgramImpl
gl::LinkResult compileProgramExecutables(gl::InfoLog &infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader, gl::LinkResult compileProgramExecutables(gl::InfoLog &infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader,
int registers); int registers);
gl::LinkResult link(gl::InfoLog &infoLog, gl::Shader *fragmentShader, gl::Shader *vertexShader, gl::LinkResult link(const gl::Data &data, gl::InfoLog &infoLog,
const std::vector<std::string> &transformFeedbackVaryings, GLenum transformFeedbackBufferMode, gl::Shader *fragmentShader, gl::Shader *vertexShader,
const std::vector<std::string> &transformFeedbackVaryings,
GLenum transformFeedbackBufferMode,
int *registers, std::vector<gl::LinkedVarying> *linkedVaryings, int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
std::map<int, gl::VariableLocation> *outputVariables, const gl::Caps &caps); std::map<int, gl::VariableLocation> *outputVariables);
void getInputLayoutSignature(const gl::VertexFormat inputLayout[], GLenum signature[]) const; void getInputLayoutSignature(const gl::VertexFormat inputLayout[], GLenum signature[]) const;
......
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