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()
maxFragmentInputComponents(0),
maxTextureImageUnits(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
GLuint maxTextureImageUnits;
GLint minProgramTexelOffset;
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)
case GL_MAX_VERTEX_ATTRIBS: *params = mCaps.maxVertexAttributes; break;
case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = mCaps.maxVertexUniformVectors; break;
case GL_MAX_VERTEX_UNIFORM_COMPONENTS: *params = mCaps.maxVertexUniformComponents; break;
case GL_MAX_VARYING_VECTORS: *params = mRenderer->getMaxVaryingVectors(); break;
case GL_MAX_VARYING_COMPONENTS: *params = mRenderer->getMaxVaryingVectors() * 4; break;
case GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS: *params = mRenderer->getMaxCombinedTextureImageUnits(); break;
case GL_MAX_VARYING_VECTORS: *params = mCaps.maxVaryingVectors; break;
case GL_MAX_VARYING_COMPONENTS: *params = mCaps.maxVertexOutputComponents; 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_TEXTURE_IMAGE_UNITS: *params = mCaps.maxTextureImageUnits; break;
case GL_MAX_FRAGMENT_UNIFORM_VECTORS: *params = mCaps.maxFragmentUniformVectors; break;
......@@ -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_3D_TEXTURE_SIZE: *params = mCaps.max3DTextureSize; break;
case GL_MAX_ARRAY_TEXTURE_LAYERS: *params = mCaps.maxArrayTextureLayers; break;
case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: *params = getUniformBufferOffsetAlignment(); break;
case GL_MAX_UNIFORM_BUFFER_BINDINGS: *params = getMaximumCombinedUniformBufferBindings(); break;
case GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT: *params = mCaps.uniformBufferOffsetAlignment; break;
case GL_MAX_UNIFORM_BUFFER_BINDINGS: *params = mCaps.maxUniformBufferBindings; break;
case GL_MAX_VERTEX_UNIFORM_BLOCKS: *params = mCaps.maxVertexUniformBlocks; 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_MINOR_VERSION: *params = 0; break;
case GL_MAX_ELEMENTS_INDICES: *params = mCaps.maxElementsIndices; break;
......@@ -983,21 +983,13 @@ void Context::getInteger64v(GLenum pname, GLint64 *params)
*params = mCaps.maxElementIndex;
break;
case GL_MAX_UNIFORM_BLOCK_SIZE:
*params = static_cast<GLint64>(mRenderer->getMaxUniformBufferSize());
*params = mCaps.maxUniformBlockSize;
break;
case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
{
GLint64 uniformBufferComponents = static_cast<GLint64>(mCaps.maxVertexUniformBlocks) * static_cast<GLint64>(mRenderer->getMaxUniformBufferSize() / 4);
GLint64 defaultBufferComponents = static_cast<GLint64>(mCaps.maxVertexUniformComponents);
*params = uniformBufferComponents + defaultBufferComponents;
}
*params = mCaps.maxCombinedVertexUniformComponents;
break;
case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
{
GLint64 uniformBufferComponents = static_cast<GLint64>(mCaps.maxFragmentUniformBlocks) * static_cast<GLint64>(mRenderer->getMaxUniformBufferSize() / 4);
GLint64 defaultBufferComponents = static_cast<GLint64>(mCaps.maxFragmentUniformComponents);
*params = uniformBufferComponents + defaultBufferComponents;
}
*params = mCaps.maxCombinedFragmentUniformComponents;
break;
case GL_MAX_SERVER_WAIT_TIMEOUT:
*params = mCaps.maxServerWaitTimeout;
......@@ -1915,27 +1907,11 @@ const Extensions &Context::getExtensions() const
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
{
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)
{
Framebuffer *framebuffer = mState.getReadFramebuffer();
......@@ -2414,6 +2390,8 @@ void Context::initCaps(GLuint clientVersion)
mCaps.maxFragmentInputComponents = std::min<GLuint>(mCaps.maxFragmentInputComponents, IMPLEMENTATION_MAX_VARYING_VECTORS * 4);
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;
mCaps.compressedTextureFormats.clear();
......
......@@ -210,10 +210,7 @@ class Context
const TextureCapsMap &getTextureCaps() const;
const Extensions &getExtensions() const;
unsigned int getMaximumCombinedTextureImageUnits() const;
unsigned int getMaximumCombinedUniformBufferBindings() const;
unsigned int getMaxTransformFeedbackBufferBindings() const;
GLintptr getUniformBufferOffsetAlignment() const;
const std::string &getRendererString() const;
const std::string &getExtensionString() const;
......
......@@ -409,7 +409,8 @@ GLint ProgramBinary::getSamplerMapping(SamplerType type, unsigned int samplerInd
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;
}
......@@ -2694,7 +2695,8 @@ bool ProgramBinary::validateSamplers(InfoLog *infoLog)
// DrawArrays and DrawElements will issue the INVALID_OPERATION error.
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];
for (unsigned int i = 0; i < IMPLEMENTATION_MAX_COMBINED_TEXTURE_IMAGE_UNITS; ++i)
......
......@@ -1314,19 +1314,19 @@ void State::getIntegerv(GLenum pname, GLint *params)
}
break;
case GL_TEXTURE_BINDING_2D:
ASSERT(mActiveSampler < mContext->getMaximumCombinedTextureImageUnits());
ASSERT(mActiveSampler < mContext->getCaps().maxCombinedTextureImageUnits);
*params = mSamplerTexture[TEXTURE_2D][mActiveSampler].id();
break;
case GL_TEXTURE_BINDING_CUBE_MAP:
ASSERT(mActiveSampler < mContext->getMaximumCombinedTextureImageUnits());
ASSERT(mActiveSampler < mContext->getCaps().maxCombinedTextureImageUnits);
*params = mSamplerTexture[TEXTURE_CUBE][mActiveSampler].id();
break;
case GL_TEXTURE_BINDING_3D:
ASSERT(mActiveSampler < mContext->getMaximumCombinedTextureImageUnits());
ASSERT(mActiveSampler <mContext->getCaps().maxCombinedTextureImageUnits);
*params = mSamplerTexture[TEXTURE_3D][mActiveSampler].id();
break;
case GL_TEXTURE_BINDING_2D_ARRAY:
ASSERT(mActiveSampler < mContext->getMaximumCombinedTextureImageUnits());
ASSERT(mActiveSampler < mContext->getCaps().maxCombinedTextureImageUnits);
*params = mSamplerTexture[TEXTURE_2D_ARRAY][mActiveSampler].id();
break;
case GL_UNIFORM_BUFFER_BINDING:
......
......@@ -43,7 +43,7 @@ void __stdcall glActiveTexture(GLenum texture)
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);
}
......@@ -5630,6 +5630,7 @@ void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
return gl::error(GL_INVALID_OPERATION);
}
const gl::Caps &caps = context->getCaps();
switch (target)
{
case GL_TRANSFORM_FEEDBACK_BUFFER_START:
......@@ -5641,8 +5642,10 @@ void __stdcall glGetIntegeri_v(GLenum target, GLuint index, GLint* data)
case GL_UNIFORM_BUFFER_START:
case GL_UNIFORM_BUFFER_SIZE:
case GL_UNIFORM_BUFFER_BINDING:
if (index >= context->getMaximumCombinedUniformBufferBindings())
if (index >= caps.maxCombinedUniformBlocks)
{
return gl::error(GL_INVALID_VALUE);
}
break;
default:
return gl::error(GL_INVALID_ENUM);
......@@ -5763,6 +5766,7 @@ void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLi
return gl::error(GL_INVALID_OPERATION);
}
const gl::Caps &caps = context->getCaps();
switch (target)
{
case GL_TRANSFORM_FEEDBACK_BUFFER:
......@@ -5773,7 +5777,7 @@ void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLi
break;
case GL_UNIFORM_BUFFER:
if (index >= context->getMaximumCombinedUniformBufferBindings())
if (index >= caps.maxUniformBufferBindings)
{
return gl::error(GL_INVALID_VALUE);
}
......@@ -5805,7 +5809,7 @@ void __stdcall glBindBufferRange(GLenum target, GLuint index, GLuint buffer, GLi
case GL_UNIFORM_BUFFER:
// 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);
}
......@@ -5834,6 +5838,7 @@ void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
return gl::error(GL_INVALID_OPERATION);
}
const gl::Caps &caps = context->getCaps();
switch (target)
{
case GL_TRANSFORM_FEEDBACK_BUFFER:
......@@ -5844,7 +5849,7 @@ void __stdcall glBindBufferBase(GLenum target, GLuint index, GLuint buffer)
break;
case GL_UNIFORM_BUFFER:
if (index >= context->getMaximumCombinedUniformBufferBindings())
if (index >= caps.maxUniformBufferBindings)
{
return gl::error(GL_INVALID_VALUE);
}
......@@ -6837,7 +6842,7 @@ void __stdcall glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, G
return gl::error(GL_INVALID_OPERATION);
}
if (uniformBlockBinding >= context->getMaximumCombinedUniformBufferBindings())
if (uniformBlockBinding >= context->getCaps().maxUniformBufferBindings)
{
return gl::error(GL_INVALID_VALUE);
}
......@@ -7128,6 +7133,7 @@ void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
return gl::error(GL_INVALID_OPERATION);
}
const gl::Caps &caps = context->getCaps();
switch (target)
{
case GL_TRANSFORM_FEEDBACK_BUFFER_START:
......@@ -7139,8 +7145,10 @@ void __stdcall glGetInteger64i_v(GLenum target, GLuint index, GLint64* data)
case GL_UNIFORM_BUFFER_START:
case GL_UNIFORM_BUFFER_SIZE:
case GL_UNIFORM_BUFFER_BINDING:
if (index >= context->getMaximumCombinedUniformBufferBindings())
if (index >= caps.maxUniformBufferBindings)
{
return gl::error(GL_INVALID_VALUE);
}
break;
default:
return gl::error(GL_INVALID_ENUM);
......@@ -7321,7 +7329,7 @@ void __stdcall glBindSampler(GLuint unit, GLuint sampler)
return gl::error(GL_INVALID_OPERATION);
}
if (unit >= context->getMaximumCombinedTextureImageUnits())
if (unit >= context->getCaps().maxCombinedTextureImageUnits)
{
return gl::error(GL_INVALID_VALUE);
}
......
......@@ -159,16 +159,13 @@ class Renderer
virtual std::string getRendererDescription() const = 0;
virtual GUID getAdapterIdentifier() const = 0;
virtual unsigned int getMaxCombinedTextureImageUnits() const = 0;
virtual unsigned int getReservedVertexUniformVectors() const = 0;
virtual unsigned int getReservedFragmentUniformVectors() const = 0;
virtual unsigned int getMaxVaryingVectors() const = 0;
virtual unsigned int getReservedVertexUniformBuffers() const = 0;
virtual unsigned int getReservedFragmentUniformBuffers() const = 0;
virtual unsigned int getMaxTransformFeedbackBuffers() const = 0;
virtual unsigned int getMaxTransformFeedbackSeparateComponents() const = 0;
virtual unsigned int getMaxTransformFeedbackInterleavedComponents() const = 0;
virtual unsigned int getMaxUniformBufferSize() const = 0;
virtual bool getShareHandleSupport() const = 0;
virtual bool getPostSubBufferSupport() const = 0;
......
......@@ -210,7 +210,8 @@ static bool packVarying(PackedVarying *varying, const int maxVaryingVectors, Var
int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, rx::FragmentShaderD3D *fragmentShader,
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();
fragmentShader->resetVaryingsRegisterAssignment();
......@@ -653,7 +654,9 @@ bool DynamicHLSL::generateShaderLinkHLSL(InfoLog &infoLog, int registers, const
// Write the HLSL input/output declarations
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);
......
......@@ -72,9 +72,9 @@ void ShaderD3D::initializeCompiler()
resources.MaxVertexAttribs = caps.maxVertexAttributes;
resources.MaxVertexUniformVectors = caps.maxVertexUniformVectors;
resources.MaxVaryingVectors = mRenderer->getMaxVaryingVectors();
resources.MaxVaryingVectors = caps.maxVaryingVectors;
resources.MaxVertexTextureImageUnits = caps.maxVertexTextureImageUnits;
resources.MaxCombinedTextureImageUnits = mRenderer->getMaxCombinedTextureImageUnits();
resources.MaxCombinedTextureImageUnits = caps.maxCombinedTextureImageUnits;
resources.MaxTextureImageUnits = caps.maxTextureImageUnits;
resources.MaxFragmentUniformVectors = caps.maxFragmentUniformVectors;
resources.MaxDrawBuffers = caps.maxDrawBuffers;
......
......@@ -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
// For our purposes we ignore any buffer data past the maximum constant buffer size
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;
case BUFFER_USAGE_VERTEX_DYNAMIC:
......
......@@ -1773,11 +1773,6 @@ GUID Renderer11::getAdapterIdentifier() const
return adapterId;
}
unsigned int Renderer11::getMaxCombinedTextureImageUnits() const
{
return getRendererCaps().maxTextureImageUnits + getRendererCaps().maxVertexTextureImageUnits;
}
unsigned int Renderer11::getReservedVertexUniformVectors() const
{
return 0; // Driver uniforms are stored in a separate constant buffer
......@@ -1788,24 +1783,6 @@ unsigned int Renderer11::getReservedFragmentUniformVectors() const
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
{
// we reserve one buffer for the application uniforms, and one for driver uniforms
......@@ -1818,13 +1795,6 @@ unsigned int Renderer11::getReservedFragmentUniformBuffers() const
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
{
META_ASSERT(gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS >= D3D11_SO_BUFFER_SLOT_COUNT &&
......@@ -1861,24 +1831,7 @@ unsigned int Renderer11::getMaxTransformFeedbackSeparateComponents() const
unsigned int Renderer11::getMaxTransformFeedbackInterleavedComponents() const
{
return (getMaxVaryingVectors() * 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;
}
return (getRendererCaps().maxVaryingVectors * 4);
}
bool Renderer11::getShareHandleSupport() const
......
......@@ -103,17 +103,13 @@ class Renderer11 : public Renderer
virtual std::string getRendererDescription() const;
virtual GUID getAdapterIdentifier() const;
virtual unsigned int getMaxCombinedTextureImageUnits() const;
virtual unsigned int getReservedVertexUniformVectors() const;
virtual unsigned int getReservedFragmentUniformVectors() const;
virtual unsigned int getMaxVaryingVectors() const;
virtual unsigned int getReservedVertexUniformBuffers() const;
virtual unsigned int getReservedFragmentUniformBuffers() const;
unsigned int getReservedVaryings() const;
virtual unsigned int getMaxTransformFeedbackBuffers() const;
virtual unsigned int getMaxTransformFeedbackSeparateComponents() const;
virtual unsigned int getMaxTransformFeedbackInterleavedComponents() const;
virtual unsigned int getMaxUniformBufferSize() const;
virtual bool getShareHandleSupport() const;
virtual bool getPostSubBufferSupport() const;
......
......@@ -611,6 +611,8 @@ static size_t GetReservedVertexOutputVectors()
static size_t GetMaximumVertexOutputVectors(D3D_FEATURE_LEVEL featureLevel)
{
META_ASSERT(gl::IMPLEMENTATION_MAX_VARYING_VECTORS == D3D11_VS_OUTPUT_REGISTER_COUNT);
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
......@@ -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)
{
GLuint maxSamples = 0;
......@@ -845,6 +871,22 @@ void GenerateCaps(ID3D11Device *device, gl::Caps *caps, gl::TextureCapsMap *text
caps->minProgramTexelOffset = GetMinimumTexelOffset(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
extensions->setTextureExtensionSupport(*textureCapsMap);
extensions->elementIndexUint = true;
......
......@@ -2189,11 +2189,6 @@ GUID Renderer9::getAdapterIdentifier() const
return mAdapterIdentifier.DeviceIdentifier;
}
unsigned int Renderer9::getMaxCombinedTextureImageUnits() const
{
return getRendererCaps().maxTextureImageUnits + getRendererCaps().maxVertexTextureImageUnits;
}
unsigned int Renderer9::getReservedVertexUniformVectors() const
{
return 2; // dx_ViewAdjust and dx_DepthRange.
......@@ -2204,11 +2199,6 @@ unsigned int Renderer9::getReservedFragmentUniformVectors() const
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
{
return 0;
......@@ -2234,11 +2224,6 @@ unsigned int Renderer9::getMaxTransformFeedbackInterleavedComponents() const
return 0;
}
unsigned int Renderer9::getMaxUniformBufferSize() const
{
return 0;
}
bool Renderer9::getShareHandleSupport() const
{
// PIX doesn't seem to support using share handles, so disable them.
......
......@@ -105,16 +105,13 @@ class Renderer9 : public Renderer
virtual std::string getRendererDescription() const;
virtual GUID getAdapterIdentifier() const;
virtual unsigned int getMaxCombinedTextureImageUnits() const;
virtual unsigned int getReservedVertexUniformVectors() const;
virtual unsigned int getReservedFragmentUniformVectors() const;
virtual unsigned int getMaxVaryingVectors() const;
virtual unsigned int getReservedVertexUniformBuffers() const;
virtual unsigned int getReservedFragmentUniformBuffers() const;
virtual unsigned int getMaxTransformFeedbackBuffers() const;
virtual unsigned int getMaxTransformFeedbackSeparateComponents() const;
virtual unsigned int getMaxTransformFeedbackInterleavedComponents() const;
virtual unsigned int getMaxUniformBufferSize() const;
virtual bool getShareHandleSupport() const;
virtual bool getPostSubBufferSupport() const;
......
......@@ -423,6 +423,19 @@ void GenerateCaps(IDirect3D9 *d3d9, IDirect3DDevice9 *device, D3DDEVTYPE deviceT
caps->minProgramTexelOffset = 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
extensions->setTextureExtensionSupport(*textureCapsMap);
extensions->elementIndexUint = deviceCaps.MaxVertexIndex >= (1 << 16);
......
......@@ -1085,7 +1085,7 @@ bool ValidateStateQuery(gl::Context *context, GLenum pname, GLenum *nativeType,
case GL_TEXTURE_BINDING_CUBE_MAP:
case GL_TEXTURE_BINDING_3D:
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);
}
......
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