Commit 3a61c321 by Geoff Lang

Add caps for the aggregate shader limits from table 6.33.

BUG=angle:658 Change-Id: I59d0cd131114fcb925f01d83d218a657f4498a2a Reviewed-on: https://chromium-review.googlesource.com/207375Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent a59b8ba4
...@@ -399,7 +399,17 @@ Caps::Caps() ...@@ -399,7 +399,17 @@ Caps::Caps()
maxFragmentInputComponents(0), maxFragmentInputComponents(0),
maxTextureImageUnits(0), maxTextureImageUnits(0),
minProgramTexelOffset(0), minProgramTexelOffset(0),
maxProgramTexelOffset(0) maxProgramTexelOffset(0),
maxUniformBufferBindings(0),
maxUniformBlockSize(0),
uniformBufferOffsetAlignment(0),
maxCombinedUniformBlocks(0),
maxCombinedVertexUniformComponents(0),
maxCombinedFragmentUniformComponents(0),
maxVaryingComponents(0),
maxVaryingVectors(0),
maxCombinedTextureImageUnits(0)
{ {
} }
......
...@@ -250,6 +250,17 @@ struct Caps ...@@ -250,6 +250,17 @@ struct Caps
GLuint maxTextureImageUnits; GLuint maxTextureImageUnits;
GLint minProgramTexelOffset; GLint minProgramTexelOffset;
GLint maxProgramTexelOffset; GLint maxProgramTexelOffset;
// Table 6.33, implementation dependent aggregate shader limits
GLuint maxUniformBufferBindings;
GLuint64 maxUniformBlockSize;
GLuint uniformBufferOffsetAlignment;
GLuint maxCombinedUniformBlocks;
GLuint64 maxCombinedVertexUniformComponents;
GLuint64 maxCombinedFragmentUniformComponents;
GLuint maxVaryingComponents;
GLuint maxVaryingVectors;
GLuint maxCombinedTextureImageUnits;
}; };
} }
......
...@@ -899,9 +899,9 @@ void Context::getIntegerv(GLenum pname, GLint *params) ...@@ -899,9 +899,9 @@ void Context::getIntegerv(GLenum pname, GLint *params)
case GL_MAX_VERTEX_ATTRIBS: *params = mCaps.maxVertexAttributes; break; case GL_MAX_VERTEX_ATTRIBS: *params = mCaps.maxVertexAttributes; break;
case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = mCaps.maxVertexUniformVectors; break; case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = mCaps.maxVertexUniformVectors; break;
case GL_MAX_VERTEX_UNIFORM_COMPONENTS: *params = mCaps.maxVertexUniformComponents; break; case GL_MAX_VERTEX_UNIFORM_COMPONENTS: *params = mCaps.maxVertexUniformComponents; break;
case GL_MAX_VARYING_VECTORS: *params = mRenderer->getMaxVaryingVectors(); break; case GL_MAX_VARYING_VECTORS: *params = mCaps.maxVaryingVectors; break;
case GL_MAX_VARYING_COMPONENTS: *params = mRenderer->getMaxVaryingVectors() * 4; break; case GL_MAX_VARYING_COMPONENTS: *params = mCaps.maxVertexOutputComponents; break;
case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = mRenderer->getMaxCombinedTextureImageUnits(); break; case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = mCaps.maxCombinedTextureImageUnits; break;
case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = mCaps.maxVertexTextureImageUnits; break; case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = mCaps.maxVertexTextureImageUnits; break;
case GL_MAX_TEXTURE_IMAGE_UNITS: *params = mCaps.maxTextureImageUnits; break; case GL_MAX_TEXTURE_IMAGE_UNITS: *params = mCaps.maxTextureImageUnits; break;
case GL_MAX_FRAGMENT_UNIFORM_VECTORS: *params = mCaps.maxFragmentUniformVectors; break; case GL_MAX_FRAGMENT_UNIFORM_VECTORS: *params = mCaps.maxFragmentUniformVectors; break;
...@@ -915,11 +915,11 @@ void Context::getIntegerv(GLenum pname, GLint *params) ...@@ -915,11 +915,11 @@ void Context::getIntegerv(GLenum pname, GLint *params)
case GL_MAX_CUBE_MAP_TEXTURE_SIZE: *params = mCaps.maxCubeMapTextureSize; break; case GL_MAX_CUBE_MAP_TEXTURE_SIZE: *params = mCaps.maxCubeMapTextureSize; break;
case GL_MAX_3D_TEXTURE_SIZE: *params = mCaps.max3DTextureSize; break; case GL_MAX_3D_TEXTURE_SIZE: *params = mCaps.max3DTextureSize; break;
case GL_MAX_ARRAY_TEXTURE_LAYERS: *params = mCaps.maxArrayTextureLayers; break; case GL_MAX_ARRAY_TEXTURE_LAYERS: *params = mCaps.maxArrayTextureLayers; break;
case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: *params = getUniformBufferOffsetAlignment(); break; case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: *params = mCaps.uniformBufferOffsetAlignment; break;
case GL_MAX_UNIFORM_BUFFER_BINDINGS: *params = getMaximumCombinedUniformBufferBindings(); break; case GL_MAX_UNIFORM_BUFFER_BINDINGS: *params = mCaps.maxUniformBufferBindings; break;
case GL_MAX_VERTEX_UNIFORM_BLOCKS: *params = mCaps.maxVertexUniformBlocks; break; case GL_MAX_VERTEX_UNIFORM_BLOCKS: *params = mCaps.maxVertexUniformBlocks; break;
case GL_MAX_FRAGMENT_UNIFORM_BLOCKS: *params = mCaps.maxFragmentUniformBlocks; break; case GL_MAX_FRAGMENT_UNIFORM_BLOCKS: *params = mCaps.maxFragmentUniformBlocks; break;
case GL_MAX_COMBINED_UNIFORM_BLOCKS: *params = getMaximumCombinedUniformBufferBindings(); break; case GL_MAX_COMBINED_UNIFORM_BLOCKS: *params = mCaps.maxCombinedTextureImageUnits; break;
case GL_MAJOR_VERSION: *params = mClientVersion; break; case GL_MAJOR_VERSION: *params = mClientVersion; break;
case GL_MINOR_VERSION: *params = 0; break; case GL_MINOR_VERSION: *params = 0; break;
case GL_MAX_ELEMENTS_INDICES: *params = mCaps.maxElementsIndices; break; case GL_MAX_ELEMENTS_INDICES: *params = mCaps.maxElementsIndices; break;
...@@ -983,21 +983,13 @@ void Context::getInteger64v(GLenum pname, GLint64 *params) ...@@ -983,21 +983,13 @@ void Context::getInteger64v(GLenum pname, GLint64 *params)
*params = mCaps.maxElementIndex; *params = mCaps.maxElementIndex;
break; break;
case GL_MAX_UNIFORM_BLOCK_SIZE: case GL_MAX_UNIFORM_BLOCK_SIZE:
*params = static_cast<GLint64>(mRenderer->getMaxUniformBufferSize()); *params = mCaps.maxUniformBlockSize;
break; break;
case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
{ *params = mCaps.maxCombinedVertexUniformComponents;
GLint64 uniformBufferComponents = static_cast<GLint64>(mCaps.maxVertexUniformBlocks) * static_cast<GLint64>(mRenderer->getMaxUniformBufferSize() / 4);
GLint64 defaultBufferComponents = static_cast<GLint64>(mCaps.maxVertexUniformComponents);
*params = uniformBufferComponents + defaultBufferComponents;
}
break; break;
case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
{ *params = mCaps.maxCombinedFragmentUniformComponents;
GLint64 uniformBufferComponents = static_cast<GLint64>(mCaps.maxFragmentUniformBlocks) * static_cast<GLint64>(mRenderer->getMaxUniformBufferSize() / 4);
GLint64 defaultBufferComponents = static_cast<GLint64>(mCaps.maxFragmentUniformComponents);
*params = uniformBufferComponents + defaultBufferComponents;
}
break; break;
case GL_MAX_SERVER_WAIT_TIMEOUT: case GL_MAX_SERVER_WAIT_TIMEOUT:
*params = mCaps.maxServerWaitTimeout; *params = mCaps.maxServerWaitTimeout;
...@@ -1915,27 +1907,11 @@ const Extensions &Context::getExtensions() const ...@@ -1915,27 +1907,11 @@ const Extensions &Context::getExtensions() const
return mExtensions; return mExtensions;
} }
unsigned int Context::getMaximumCombinedTextureImageUnits() const
{
return mRenderer->getMaxCombinedTextureImageUnits();
}
unsigned int Context::getMaximumCombinedUniformBufferBindings() const
{
return mCaps.maxVertexUniformBlocks + mCaps.maxFragmentUniformBlocks;
}
unsigned int Context::getMaxTransformFeedbackBufferBindings() const unsigned int Context::getMaxTransformFeedbackBufferBindings() const
{ {
return mRenderer->getMaxTransformFeedbackBuffers(); return mRenderer->getMaxTransformFeedbackBuffers();
} }
GLintptr Context::getUniformBufferOffsetAlignment() const
{
// setting a large alignment forces uniform buffers to bind with zero offset
return static_cast<GLintptr>(std::numeric_limits<GLint>::max());
}
void Context::getCurrentReadFormatType(GLenum *internalFormat, GLenum *format, GLenum *type) void Context::getCurrentReadFormatType(GLenum *internalFormat, GLenum *format, GLenum *type)
{ {
Framebuffer *framebuffer = mState.getReadFramebuffer(); Framebuffer *framebuffer = mState.getReadFramebuffer();
...@@ -2414,6 +2390,8 @@ void Context::initCaps(GLuint clientVersion) ...@@ -2414,6 +2390,8 @@ void Context::initCaps(GLuint clientVersion)
mCaps.maxFragmentInputComponents = std::min<GLuint>(mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4); mCaps.maxFragmentInputComponents = std::min<GLuint>(mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
mCaps.maxTextureImageUnits = std::min<GLuint>(mCaps.maxTextureImageUnits, MAX_TEXTURE_IMAGE_UNITS); mCaps.maxTextureImageUnits = std::min<GLuint>(mCaps.maxTextureImageUnits, MAX_TEXTURE_IMAGE_UNITS);
mCaps.maxCombinedTextureImageUnits = std::min<GLuint>(mCaps.maxCombinedTextureImageUnits, IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS);
GLuint maxSamples = 0; GLuint maxSamples = 0;
mCaps.compressedTextureFormats.clear(); mCaps.compressedTextureFormats.clear();
......
...@@ -210,10 +210,7 @@ class Context ...@@ -210,10 +210,7 @@ class Context
const TextureCapsMap &getTextureCaps() const; const TextureCapsMap &getTextureCaps() const;
const Extensions &getExtensions() const; const Extensions &getExtensions() const;
unsigned int getMaximumCombinedTextureImageUnits() const;
unsigned int getMaximumCombinedUniformBufferBindings() const;
unsigned int getMaxTransformFeedbackBufferBindings() const; unsigned int getMaxTransformFeedbackBufferBindings() const;
GLintptr getUniformBufferOffsetAlignment() const;
const std::string &getRendererString() const; const std::string &getRendererString() const;
const std::string &getExtensionString() const; const std::string &getExtensionString() const;
......
...@@ -409,7 +409,8 @@ GLint ProgramBinary::getSamplerMapping(SamplerType type, unsigned int samplerInd ...@@ -409,7 +409,8 @@ GLint ProgramBinary::getSamplerMapping(SamplerType type, unsigned int samplerInd
default: UNREACHABLE(); default: UNREACHABLE();
} }
if (logicalTextureUnit >= 0 && logicalTextureUnit < (GLint)mRenderer->getMaxCombinedTextureImageUnits()) // TODO (geofflang): Use context's caps
if (logicalTextureUnit >= 0 && logicalTextureUnit < (GLint)mRenderer->getRendererCaps().maxCombinedTextureImageUnits)
{ {
return logicalTextureUnit; return logicalTextureUnit;
} }
...@@ -2694,7 +2695,8 @@ bool ProgramBinary::validateSamplers(InfoLog *infoLog) ...@@ -2694,7 +2695,8 @@ bool ProgramBinary::validateSamplers(InfoLog *infoLog)
// DrawArrays and DrawElements will issue the INVALID_OPERATION error. // DrawArrays and DrawElements will issue the INVALID_OPERATION error.
updateSamplerMapping(); updateSamplerMapping();
const unsigned int maxCombinedTextureImageUnits = mRenderer->getMaxCombinedTextureImageUnits(); // TODO (geofflang): Use context's caps
const unsigned int maxCombinedTextureImageUnits = mRenderer->getRendererCaps().maxCombinedTextureImageUnits;
TextureType textureUnitType[IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS]; TextureType textureUnitType[IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS];
for (unsigned int i = 0; i < IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS; ++i) for (unsigned int i = 0; i < IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS; ++i)
......
...@@ -1314,19 +1314,19 @@ void State::getIntegerv(GLenum pname, GLint *params) ...@@ -1314,19 +1314,19 @@ void State::getIntegerv(GLenum pname, GLint *params)
} }
break; break;
case GL_TEXTURE_BINDING_2D: case GL_TEXTURE_BINDING_2D:
ASSERT(mActiveSampler < mContext->getMaximumCombinedTextureImageUnits()); ASSERT(mActiveSampler < mContext->getCaps().maxCombinedTextureImageUnits);
*params = mSamplerTexture[TEXTURE_2D][mActiveSampler].id(); *params = mSamplerTexture[TEXTURE_2D][mActiveSampler].id();
break; break;
case GL_TEXTURE_BINDING_CUBE_MAP: case GL_TEXTURE_BINDING_CUBE_MAP:
ASSERT(mActiveSampler < mContext->getMaximumCombinedTextureImageUnits()); ASSERT(mActiveSampler < mContext->getCaps().maxCombinedTextureImageUnits);
*params = mSamplerTexture[TEXTURE_CUBE][mActiveSampler].id(); *params = mSamplerTexture[TEXTURE_CUBE][mActiveSampler].id();
break; break;
case GL_TEXTURE_BINDING_3D: case GL_TEXTURE_BINDING_3D:
ASSERT(mActiveSampler < mContext->getMaximumCombinedTextureImageUnits()); ASSERT(mActiveSampler <mContext->getCaps().maxCombinedTextureImageUnits);
*params = mSamplerTexture[TEXTURE_3D][mActiveSampler].id(); *params = mSamplerTexture[TEXTURE_3D][mActiveSampler].id();
break; break;
case GL_TEXTURE_BINDING_2D_ARRAY: case GL_TEXTURE_BINDING_2D_ARRAY:
ASSERT(mActiveSampler < mContext->getMaximumCombinedTextureImageUnits()); ASSERT(mActiveSampler < mContext->getCaps().maxCombinedTextureImageUnits);
*params = mSamplerTexture[TEXTURE_2D_ARRAY][mActiveSampler].id(); *params = mSamplerTexture[TEXTURE_2D_ARRAY][mActiveSampler].id();
break; break;
case GL_UNIFORM_BUFFER_BINDING: case GL_UNIFORM_BUFFER_BINDING:
......
...@@ -43,7 +43,7 @@ void __stdcall glActiveTexture(GLenum texture) ...@@ -43,7 +43,7 @@ void __stdcall glActiveTexture(GLenum texture)
if (context) if (context)
{ {
if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getMaximumCombinedTextureImageUnits() - 1) if (texture < GL_TEXTURE0 || texture > GL_TEXTURE0 + context->getCaps().maxCombinedTextureImageUnits - 1)
{ {
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
} }
...@@ -5630,6 +5630,7 @@ void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data) ...@@ -5630,6 +5630,7 @@ void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
return gl::error(GL_INVALID_OPERATION); return gl::error(GL_INVALID_OPERATION);
} }
const gl::Caps &caps = context->getCaps();
switch (target) switch (target)
{ {
case GL_TRANSFORM_FEEDBACK_BUFFER_START: case GL_TRANSFORM_FEEDBACK_BUFFER_START:
...@@ -5641,8 +5642,10 @@ void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data) ...@@ -5641,8 +5642,10 @@ void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
case GL_UNIFORM_BUFFER_START: case GL_UNIFORM_BUFFER_START:
case GL_UNIFORM_BUFFER_SIZE: case GL_UNIFORM_BUFFER_SIZE:
case GL_UNIFORM_BUFFER_BINDING: case GL_UNIFORM_BUFFER_BINDING:
if (index >= context->getMaximumCombinedUniformBufferBindings()) if (index >= caps.maxCombinedUniformBlocks)
{
return gl::error(GL_INVALID_VALUE); return gl::error(GL_INVALID_VALUE);
}
break; break;
default: default:
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
...@@ -5763,6 +5766,7 @@ void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLi ...@@ -5763,6 +5766,7 @@ void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLi
return gl::error(GL_INVALID_OPERATION); return gl::error(GL_INVALID_OPERATION);
} }
const gl::Caps &caps = context->getCaps();
switch (target) switch (target)
{ {
case GL_TRANSFORM_FEEDBACK_BUFFER: case GL_TRANSFORM_FEEDBACK_BUFFER:
...@@ -5773,7 +5777,7 @@ void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLi ...@@ -5773,7 +5777,7 @@ void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLi
break; break;
case GL_UNIFORM_BUFFER: case GL_UNIFORM_BUFFER:
if (index >= context->getMaximumCombinedUniformBufferBindings()) if (index >= caps.maxUniformBufferBindings)
{ {
return gl::error(GL_INVALID_VALUE); return gl::error(GL_INVALID_VALUE);
} }
...@@ -5805,7 +5809,7 @@ void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLi ...@@ -5805,7 +5809,7 @@ void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLi
case GL_UNIFORM_BUFFER: case GL_UNIFORM_BUFFER:
// it is an error to bind an offset not a multiple of the alignment // it is an error to bind an offset not a multiple of the alignment
if (buffer != 0 && (offset % context->getUniformBufferOffsetAlignment()) != 0) if (buffer != 0 && (offset % caps.uniformBufferOffsetAlignment) != 0)
{ {
return gl::error(GL_INVALID_VALUE); return gl::error(GL_INVALID_VALUE);
} }
...@@ -5834,6 +5838,7 @@ void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer) ...@@ -5834,6 +5838,7 @@ void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
return gl::error(GL_INVALID_OPERATION); return gl::error(GL_INVALID_OPERATION);
} }
const gl::Caps &caps = context->getCaps();
switch (target) switch (target)
{ {
case GL_TRANSFORM_FEEDBACK_BUFFER: case GL_TRANSFORM_FEEDBACK_BUFFER:
...@@ -5844,7 +5849,7 @@ void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer) ...@@ -5844,7 +5849,7 @@ void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
break; break;
case GL_UNIFORM_BUFFER: case GL_UNIFORM_BUFFER:
if (index >= context->getMaximumCombinedUniformBufferBindings()) if (index >= caps.maxUniformBufferBindings)
{ {
return gl::error(GL_INVALID_VALUE); return gl::error(GL_INVALID_VALUE);
} }
...@@ -6837,7 +6842,7 @@ void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, G ...@@ -6837,7 +6842,7 @@ void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, G
return gl::error(GL_INVALID_OPERATION); return gl::error(GL_INVALID_OPERATION);
} }
if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings()) if (uniformBlockBinding >= context->getCaps().maxUniformBufferBindings)
{ {
return gl::error(GL_INVALID_VALUE); return gl::error(GL_INVALID_VALUE);
} }
...@@ -7128,6 +7133,7 @@ void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data) ...@@ -7128,6 +7133,7 @@ void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
return gl::error(GL_INVALID_OPERATION); return gl::error(GL_INVALID_OPERATION);
} }
const gl::Caps &caps = context->getCaps();
switch (target) switch (target)
{ {
case GL_TRANSFORM_FEEDBACK_BUFFER_START: case GL_TRANSFORM_FEEDBACK_BUFFER_START:
...@@ -7139,8 +7145,10 @@ void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data) ...@@ -7139,8 +7145,10 @@ void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
case GL_UNIFORM_BUFFER_START: case GL_UNIFORM_BUFFER_START:
case GL_UNIFORM_BUFFER_SIZE: case GL_UNIFORM_BUFFER_SIZE:
case GL_UNIFORM_BUFFER_BINDING: case GL_UNIFORM_BUFFER_BINDING:
if (index >= context->getMaximumCombinedUniformBufferBindings()) if (index >= caps.maxUniformBufferBindings)
{
return gl::error(GL_INVALID_VALUE); return gl::error(GL_INVALID_VALUE);
}
break; break;
default: default:
return gl::error(GL_INVALID_ENUM); return gl::error(GL_INVALID_ENUM);
...@@ -7321,7 +7329,7 @@ void __stdcall glBindSampler(GLuint unit, GLuint sampler) ...@@ -7321,7 +7329,7 @@ void __stdcall glBindSampler(GLuint unit, GLuint sampler)
return gl::error(GL_INVALID_OPERATION); return gl::error(GL_INVALID_OPERATION);
} }
if (unit >= context->getMaximumCombinedTextureImageUnits()) if (unit >= context->getCaps().maxCombinedTextureImageUnits)
{ {
return gl::error(GL_INVALID_VALUE); return gl::error(GL_INVALID_VALUE);
} }
......
...@@ -159,16 +159,13 @@ class Renderer ...@@ -159,16 +159,13 @@ class Renderer
virtual std::string getRendererDescription() const = 0; virtual std::string getRendererDescription() const = 0;
virtual GUID getAdapterIdentifier() const = 0; virtual GUID getAdapterIdentifier() const = 0;
virtual unsigned int getMaxCombinedTextureImageUnits() const = 0;
virtual unsigned int getReservedVertexUniformVectors() const = 0; virtual unsigned int getReservedVertexUniformVectors() const = 0;
virtual unsigned int getReservedFragmentUniformVectors() const = 0; virtual unsigned int getReservedFragmentUniformVectors() const = 0;
virtual unsigned int getMaxVaryingVectors() const = 0;
virtual unsigned int getReservedVertexUniformBuffers() const = 0; virtual unsigned int getReservedVertexUniformBuffers() const = 0;
virtual unsigned int getReservedFragmentUniformBuffers() const = 0; virtual unsigned int getReservedFragmentUniformBuffers() const = 0;
virtual unsigned int getMaxTransformFeedbackBuffers() const = 0; virtual unsigned int getMaxTransformFeedbackBuffers() const = 0;
virtual unsigned int getMaxTransformFeedbackSeparateComponents() const = 0; virtual unsigned int getMaxTransformFeedbackSeparateComponents() const = 0;
virtual unsigned int getMaxTransformFeedbackInterleavedComponents() const = 0; virtual unsigned int getMaxTransformFeedbackInterleavedComponents() const = 0;
virtual unsigned int getMaxUniformBufferSize() const = 0;
virtual bool getShareHandleSupport() const = 0; virtual bool getShareHandleSupport() const = 0;
virtual bool getPostSubBufferSupport() const = 0; virtual bool getPostSubBufferSupport() const = 0;
......
...@@ -210,7 +210,8 @@ static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, Var ...@@ -210,7 +210,8 @@ static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, Var
int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, rx::FragmentShaderD3D *fragmentShader, int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, rx::FragmentShaderD3D *fragmentShader,
rx::VertexShaderD3D *vertexShader, const std::vector<std::string>& transformFeedbackVaryings) rx::VertexShaderD3D *vertexShader, const std::vector<std::string>& transformFeedbackVaryings)
{ {
const int maxVaryingVectors = mRenderer->getMaxVaryingVectors(); // TODO (geofflang): Use context's caps
const int maxVaryingVectors = mRenderer->getRendererCaps().maxVaryingVectors;
vertexShader->resetVaryingsRegisterAssignment(); vertexShader->resetVaryingsRegisterAssignment();
fragmentShader->resetVaryingsRegisterAssignment(); fragmentShader->resetVaryingsRegisterAssignment();
...@@ -653,7 +654,9 @@ bool DynamicHLSL::generateShaderLinkHLSL(InfoLog &infoLog, int registers, const ...@@ -653,7 +654,9 @@ 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();
const int maxVaryingVectors = mRenderer->getMaxVaryingVectors();
// 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);
......
...@@ -72,9 +72,9 @@ void ShaderD3D::initializeCompiler() ...@@ -72,9 +72,9 @@ void ShaderD3D::initializeCompiler()
resources.MaxVertexAttribs = caps.maxVertexAttributes; resources.MaxVertexAttribs = caps.maxVertexAttributes;
resources.MaxVertexUniformVectors = caps.maxVertexUniformVectors; resources.MaxVertexUniformVectors = caps.maxVertexUniformVectors;
resources.MaxVaryingVectors = mRenderer->getMaxVaryingVectors(); resources.MaxVaryingVectors = caps.maxVaryingVectors;
resources.MaxVertexTextureImageUnits = caps.maxVertexTextureImageUnits; resources.MaxVertexTextureImageUnits = caps.maxVertexTextureImageUnits;
resources.MaxCombinedTextureImageUnits = mRenderer->getMaxCombinedTextureImageUnits(); resources.MaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
resources.MaxTextureImageUnits = caps.maxTextureImageUnits; resources.MaxTextureImageUnits = caps.maxTextureImageUnits;
resources.MaxFragmentUniformVectors = caps.maxFragmentUniformVectors; resources.MaxFragmentUniformVectors = caps.maxFragmentUniformVectors;
resources.MaxDrawBuffers = caps.maxDrawBuffers; resources.MaxDrawBuffers = caps.maxDrawBuffers;
......
...@@ -787,7 +787,7 @@ void Buffer11::NativeBuffer11::fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, Ren ...@@ -787,7 +787,7 @@ void Buffer11::NativeBuffer11::fillBufferDesc(D3D11_BUFFER_DESC* bufferDesc, Ren
// Constant buffers must be of a limited size, and aligned to 16 byte boundaries // Constant buffers must be of a limited size, and aligned to 16 byte boundaries
// For our purposes we ignore any buffer data past the maximum constant buffer size // For our purposes we ignore any buffer data past the maximum constant buffer size
bufferDesc->ByteWidth = roundUp(bufferDesc->ByteWidth, 16u); bufferDesc->ByteWidth = roundUp(bufferDesc->ByteWidth, 16u);
bufferDesc->ByteWidth = std::min(bufferDesc->ByteWidth, renderer->getMaxUniformBufferSize()); bufferDesc->ByteWidth = std::min<UINT>(bufferDesc->ByteWidth, renderer->getRendererCaps().maxUniformBlockSize);
break; break;
case BUFFER_USAGE_VERTEX_DYNAMIC: case BUFFER_USAGE_VERTEX_DYNAMIC:
......
...@@ -1773,11 +1773,6 @@ GUID Renderer11::getAdapterIdentifier() const ...@@ -1773,11 +1773,6 @@ GUID Renderer11::getAdapterIdentifier() const
return adapterId; return adapterId;
} }
unsigned int Renderer11::getMaxCombinedTextureImageUnits() const
{
return getRendererCaps().maxTextureImageUnits + getRendererCaps().maxVertexTextureImageUnits;
}
unsigned int Renderer11::getReservedVertexUniformVectors() const unsigned int Renderer11::getReservedVertexUniformVectors() const
{ {
return 0; // Driver uniforms are stored in a separate constant buffer return 0; // Driver uniforms are stored in a separate constant buffer
...@@ -1788,24 +1783,6 @@ unsigned int Renderer11::getReservedFragmentUniformVectors() const ...@@ -1788,24 +1783,6 @@ unsigned int Renderer11::getReservedFragmentUniformVectors() const
return 0; // Driver uniforms are stored in a separate constant buffer return 0; // Driver uniforms are stored in a separate constant buffer
} }
unsigned int Renderer11::getMaxVaryingVectors() const
{
META_ASSERT(gl::IMPLEMENTATION_MAX_VARYING_VECTORS == D3D11_VS_OUTPUT_REGISTER_COUNT);
META_ASSERT(D3D11_VS_OUTPUT_REGISTER_COUNT <= D3D11_PS_INPUT_REGISTER_COUNT);
META_ASSERT(D3D10_VS_OUTPUT_REGISTER_COUNT <= D3D10_PS_INPUT_REGISTER_COUNT);
switch (mFeatureLevel)
{
case D3D_FEATURE_LEVEL_11_0:
return D3D11_VS_OUTPUT_REGISTER_COUNT - getReservedVaryings();
case D3D_FEATURE_LEVEL_10_1:
return D3D10_1_VS_OUTPUT_REGISTER_COUNT - getReservedVaryings();
case D3D_FEATURE_LEVEL_10_0:
return D3D10_VS_OUTPUT_REGISTER_COUNT - getReservedVaryings();
default: UNREACHABLE();
return 0;
}
}
unsigned int Renderer11::getReservedVertexUniformBuffers() const unsigned int Renderer11::getReservedVertexUniformBuffers() const
{ {
// we reserve one buffer for the application uniforms, and one for driver uniforms // we reserve one buffer for the application uniforms, and one for driver uniforms
...@@ -1818,13 +1795,6 @@ unsigned int Renderer11::getReservedFragmentUniformBuffers() const ...@@ -1818,13 +1795,6 @@ unsigned int Renderer11::getReservedFragmentUniformBuffers() const
return 2; return 2;
} }
unsigned int Renderer11::getReservedVaryings() const
{
// We potentially reserve varyings for gl_Position, dx_Position, gl_FragCoord and gl_PointSize
return 4;
}
unsigned int Renderer11::getMaxTransformFeedbackBuffers() const unsigned int Renderer11::getMaxTransformFeedbackBuffers() const
{ {
META_ASSERT(gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS >= D3D11_SO_BUFFER_SLOT_COUNT && META_ASSERT(gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS >= D3D11_SO_BUFFER_SLOT_COUNT &&
...@@ -1861,24 +1831,7 @@ unsigned int Renderer11::getMaxTransformFeedbackSeparateComponents() const ...@@ -1861,24 +1831,7 @@ unsigned int Renderer11::getMaxTransformFeedbackSeparateComponents() const
unsigned int Renderer11::getMaxTransformFeedbackInterleavedComponents() const unsigned int Renderer11::getMaxTransformFeedbackInterleavedComponents() const
{ {
return (getMaxVaryingVectors() * 4); return (getRendererCaps().maxVaryingVectors * 4);
}
unsigned int Renderer11::getMaxUniformBufferSize() const
{
// Each component is a 4-element vector of 4-byte units (floats)
const unsigned int bytesPerComponent = 4 * sizeof(float);
switch (mFeatureLevel)
{
case D3D_FEATURE_LEVEL_11_0:
return D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * bytesPerComponent;
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0:
return D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * bytesPerComponent;
default: UNREACHABLE();
return 0;
}
} }
bool Renderer11::getShareHandleSupport() const bool Renderer11::getShareHandleSupport() const
......
...@@ -103,17 +103,13 @@ class Renderer11 : public Renderer ...@@ -103,17 +103,13 @@ class Renderer11 : public Renderer
virtual std::string getRendererDescription() const; virtual std::string getRendererDescription() const;
virtual GUID getAdapterIdentifier() const; virtual GUID getAdapterIdentifier() const;
virtual unsigned int getMaxCombinedTextureImageUnits() const;
virtual unsigned int getReservedVertexUniformVectors() const; virtual unsigned int getReservedVertexUniformVectors() const;
virtual unsigned int getReservedFragmentUniformVectors() const; virtual unsigned int getReservedFragmentUniformVectors() const;
virtual unsigned int getMaxVaryingVectors() const;
virtual unsigned int getReservedVertexUniformBuffers() const; virtual unsigned int getReservedVertexUniformBuffers() const;
virtual unsigned int getReservedFragmentUniformBuffers() const; virtual unsigned int getReservedFragmentUniformBuffers() const;
unsigned int getReservedVaryings() const;
virtual unsigned int getMaxTransformFeedbackBuffers() const; virtual unsigned int getMaxTransformFeedbackBuffers() const;
virtual unsigned int getMaxTransformFeedbackSeparateComponents() const; virtual unsigned int getMaxTransformFeedbackSeparateComponents() const;
virtual unsigned int getMaxTransformFeedbackInterleavedComponents() const; virtual unsigned int getMaxTransformFeedbackInterleavedComponents() const;
virtual unsigned int getMaxUniformBufferSize() const;
virtual bool getShareHandleSupport() const; virtual bool getShareHandleSupport() const;
virtual bool getPostSubBufferSupport() const; virtual bool getPostSubBufferSupport() const;
......
...@@ -611,6 +611,8 @@ static size_t GetReservedVertexOutputVectors() ...@@ -611,6 +611,8 @@ static size_t GetReservedVertexOutputVectors()
static size_t GetMaximumVertexOutputVectors(D3D_FEATURE_LEVEL featureLevel) static size_t GetMaximumVertexOutputVectors(D3D_FEATURE_LEVEL featureLevel)
{ {
META_ASSERT(gl::IMPLEMENTATION_MAX_VARYING_VECTORS == D3D11_VS_OUTPUT_REGISTER_COUNT);
switch (featureLevel) switch (featureLevel)
{ {
case D3D_FEATURE_LEVEL_11_1: case D3D_FEATURE_LEVEL_11_1:
...@@ -769,6 +771,30 @@ static int GetMaximumTexelOffset(D3D_FEATURE_LEVEL featureLevel) ...@@ -769,6 +771,30 @@ static int GetMaximumTexelOffset(D3D_FEATURE_LEVEL featureLevel)
} }
} }
static size_t GetMaximumConstantBufferSize(D3D_FEATURE_LEVEL featureLevel)
{
// Returns a size_t despite the limit being a GLuint64 because size_t is the maximum size of
// any buffer that could be allocated.
const size_t bytesPerComponent = 4 * sizeof(float);
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0: return D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * bytesPerComponent;
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0: return D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * bytesPerComponent;
// Limits from http://msdn.microsoft.com/en-us/library/windows/desktop/ff476501.aspx remarks section
case D3D_FEATURE_LEVEL_9_3:
case D3D_FEATURE_LEVEL_9_2:
case D3D_FEATURE_LEVEL_9_1: return 4096 * bytesPerComponent;
default: UNREACHABLE(); return 0;
}
}
void GenerateCaps(ID3D11Device *device, gl::Caps *caps, gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions) void GenerateCaps(ID3D11Device *device, gl::Caps *caps, gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions)
{ {
GLuint maxSamples = 0; GLuint maxSamples = 0;
...@@ -845,6 +871,22 @@ void GenerateCaps(ID3D11Device *device, gl::Caps *caps, gl::TextureCapsMap *text ...@@ -845,6 +871,22 @@ void GenerateCaps(ID3D11Device *device, gl::Caps *caps, gl::TextureCapsMap *text
caps->minProgramTexelOffset = GetMinimumTexelOffset(featureLevel); caps->minProgramTexelOffset = GetMinimumTexelOffset(featureLevel);
caps->maxProgramTexelOffset = GetMaximumTexelOffset(featureLevel); caps->maxProgramTexelOffset = GetMaximumTexelOffset(featureLevel);
// Aggregate shader limits
caps->maxUniformBufferBindings = caps->maxVertexUniformBlocks + caps->maxFragmentUniformBlocks;
caps->maxUniformBlockSize = GetMaximumConstantBufferSize(featureLevel);
// Setting a large alignment forces uniform buffers to bind with zero offset
caps->uniformBufferOffsetAlignment = static_cast<GLuint>(std::numeric_limits<GLint>::max());
caps->maxCombinedUniformBlocks = caps->maxVertexUniformBlocks + caps->maxFragmentUniformBlocks;
caps->maxCombinedVertexUniformComponents = (static_cast<GLint64>(caps->maxVertexUniformBlocks) * static_cast<GLint64>(caps->maxUniformBlockSize / 4)) +
static_cast<GLint64>(caps->maxVertexUniformComponents);
caps->maxCombinedFragmentUniformComponents = (static_cast<GLint64>(caps->maxFragmentUniformBlocks) * static_cast<GLint64>(caps->maxUniformBlockSize / 4)) +
static_cast<GLint64>(caps->maxFragmentUniformComponents);
caps->maxVaryingComponents = GetMaximumVertexOutputVectors(featureLevel) * 4;
caps->maxVaryingVectors = GetMaximumVertexOutputVectors(featureLevel);
caps->maxCombinedTextureImageUnits = caps->maxVertexTextureImageUnits + caps->maxFragmentInputComponents;
// GL extension support // GL extension support
extensions->setTextureExtensionSupport(*textureCapsMap); extensions->setTextureExtensionSupport(*textureCapsMap);
extensions->elementIndexUint = true; extensions->elementIndexUint = true;
......
...@@ -2189,11 +2189,6 @@ GUID Renderer9::getAdapterIdentifier() const ...@@ -2189,11 +2189,6 @@ GUID Renderer9::getAdapterIdentifier() const
return mAdapterIdentifier.DeviceIdentifier; return mAdapterIdentifier.DeviceIdentifier;
} }
unsigned int Renderer9::getMaxCombinedTextureImageUnits() const
{
return getRendererCaps().maxTextureImageUnits + getRendererCaps().maxVertexTextureImageUnits;
}
unsigned int Renderer9::getReservedVertexUniformVectors() const unsigned int Renderer9::getReservedVertexUniformVectors() const
{ {
return 2; // dx_ViewAdjust and dx_DepthRange. return 2; // dx_ViewAdjust and dx_DepthRange.
...@@ -2204,11 +2199,6 @@ unsigned int Renderer9::getReservedFragmentUniformVectors() const ...@@ -2204,11 +2199,6 @@ unsigned int Renderer9::getReservedFragmentUniformVectors() const
return 3; // dx_ViewCoords, dx_DepthFront and dx_DepthRange. return 3; // dx_ViewCoords, dx_DepthFront and dx_DepthRange.
} }
unsigned int Renderer9::getMaxVaryingVectors() const
{
return (getMajorShaderModel() >= 3) ? MAX_VARYING_VECTORS_SM3 : MAX_VARYING_VECTORS_SM2;
}
unsigned int Renderer9::getReservedVertexUniformBuffers() const unsigned int Renderer9::getReservedVertexUniformBuffers() const
{ {
return 0; return 0;
...@@ -2234,11 +2224,6 @@ unsigned int Renderer9::getMaxTransformFeedbackInterleavedComponents() const ...@@ -2234,11 +2224,6 @@ unsigned int Renderer9::getMaxTransformFeedbackInterleavedComponents() const
return 0; return 0;
} }
unsigned int Renderer9::getMaxUniformBufferSize() const
{
return 0;
}
bool Renderer9::getShareHandleSupport() const bool Renderer9::getShareHandleSupport() const
{ {
// PIX doesn't seem to support using share handles, so disable them. // PIX doesn't seem to support using share handles, so disable them.
......
...@@ -105,16 +105,13 @@ class Renderer9 : public Renderer ...@@ -105,16 +105,13 @@ class Renderer9 : public Renderer
virtual std::string getRendererDescription() const; virtual std::string getRendererDescription() const;
virtual GUID getAdapterIdentifier() const; virtual GUID getAdapterIdentifier() const;
virtual unsigned int getMaxCombinedTextureImageUnits() const;
virtual unsigned int getReservedVertexUniformVectors() const; virtual unsigned int getReservedVertexUniformVectors() const;
virtual unsigned int getReservedFragmentUniformVectors() const; virtual unsigned int getReservedFragmentUniformVectors() const;
virtual unsigned int getMaxVaryingVectors() const;
virtual unsigned int getReservedVertexUniformBuffers() const; virtual unsigned int getReservedVertexUniformBuffers() const;
virtual unsigned int getReservedFragmentUniformBuffers() const; virtual unsigned int getReservedFragmentUniformBuffers() const;
virtual unsigned int getMaxTransformFeedbackBuffers() const; virtual unsigned int getMaxTransformFeedbackBuffers() const;
virtual unsigned int getMaxTransformFeedbackSeparateComponents() const; virtual unsigned int getMaxTransformFeedbackSeparateComponents() const;
virtual unsigned int getMaxTransformFeedbackInterleavedComponents() const; virtual unsigned int getMaxTransformFeedbackInterleavedComponents() const;
virtual unsigned int getMaxUniformBufferSize() const;
virtual bool getShareHandleSupport() const; virtual bool getShareHandleSupport() const;
virtual bool getPostSubBufferSupport() const; virtual bool getPostSubBufferSupport() const;
......
...@@ -423,6 +423,19 @@ void GenerateCaps(IDirect3D9 *d3d9, IDirect3DDevice9 *device, D3DDEVTYPE deviceT ...@@ -423,6 +423,19 @@ void GenerateCaps(IDirect3D9 *d3d9, IDirect3DDevice9 *device, D3DDEVTYPE deviceT
caps->minProgramTexelOffset = 0; caps->minProgramTexelOffset = 0;
caps->maxProgramTexelOffset = 0; caps->maxProgramTexelOffset = 0;
// Aggregate shader limits (unused in ES2)
caps->maxUniformBufferBindings = 0;
caps->maxUniformBlockSize = 0;
caps->uniformBufferOffsetAlignment = 0;
caps->maxCombinedUniformBlocks = 0;
caps->maxCombinedVertexUniformComponents = 0;
caps->maxCombinedFragmentUniformComponents = 0;
caps->maxVaryingComponents = 0;
// Aggregate shader limits
caps->maxVaryingVectors = caps->maxVertexOutputComponents / 4;
caps->maxCombinedTextureImageUnits = caps->maxVertexTextureImageUnits + caps->maxFragmentInputComponents;
// GL extension support // GL extension support
extensions->setTextureExtensionSupport(*textureCapsMap); extensions->setTextureExtensionSupport(*textureCapsMap);
extensions->elementIndexUint = deviceCaps.MaxVertexIndex >= (1 << 16); extensions->elementIndexUint = deviceCaps.MaxVertexIndex >= (1 << 16);
......
...@@ -1085,7 +1085,7 @@ bool ValidateStateQuery(gl::Context *context, GLenum pname, GLenum *nativeType, ...@@ -1085,7 +1085,7 @@ bool ValidateStateQuery(gl::Context *context, GLenum pname, GLenum *nativeType,
case GL_TEXTURE_BINDING_CUBE_MAP: case GL_TEXTURE_BINDING_CUBE_MAP:
case GL_TEXTURE_BINDING_3D: case GL_TEXTURE_BINDING_3D:
case GL_TEXTURE_BINDING_2D_ARRAY: case GL_TEXTURE_BINDING_2D_ARRAY:
if (context->getState().getActiveSampler() >= context->getMaximumCombinedTextureImageUnits()) if (context->getState().getActiveSampler() >= context->getCaps().maxCombinedTextureImageUnits)
{ {
return gl::error(GL_INVALID_OPERATION, false); return gl::error(GL_INVALID_OPERATION, false);
} }
......
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