Commit 301d161d by Geoff Lang

Add caps for vertex and fragment shader limits from tables 6.31 and 6.32.

BUG=angle:658 Change-Id: I98509aa16caf74c3e4e28852e8b59aedd903f03a Reviewed-on: https://chromium-review.googlesource.com/207372Reviewed-by: 's avatarBrandon Jones <bajones@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 900013cd
...@@ -384,7 +384,22 @@ Caps::Caps() ...@@ -384,7 +384,22 @@ Caps::Caps()
// Table 6.29 // Table 6.29
maxElementsIndices(0), maxElementsIndices(0),
maxElementsVertices(0), maxElementsVertices(0),
maxServerWaitTimeout(0) maxServerWaitTimeout(0),
// Table 6.31
maxVertexAttributes(0),
maxVertexUniformComponents(0),
maxVertexUniformVectors(0),
maxVertexUniformBlocks(0),
maxVertexOutputComponents(0),
maxVertexTextureImageUnits(0),
// Table 6.32
maxFragmentUniformComponents(0),
maxFragmentUniformVectors(0),
maxFragmentUniformBlocks(0),
maxFragmentInputComponents(0),
maxTextureImageUnits(0),
minProgramTexelOffset(0),
maxProgramTexelOffset(0)
{ {
} }
......
...@@ -233,6 +233,23 @@ struct Caps ...@@ -233,6 +233,23 @@ struct Caps
std::vector<GLenum> programBinaryFormats; std::vector<GLenum> programBinaryFormats;
std::vector<GLenum> shaderBinaryFormats; std::vector<GLenum> shaderBinaryFormats;
GLuint64 maxServerWaitTimeout; GLuint64 maxServerWaitTimeout;
// Table 6.31, implementation dependent vertex shader limits
GLuint maxVertexAttributes;
GLuint maxVertexUniformComponents;
GLuint maxVertexUniformVectors;
GLuint maxVertexUniformBlocks;
GLuint maxVertexOutputComponents;
GLuint maxVertexTextureImageUnits;
// Table 6.32, implementation dependent fragment shader limits
GLuint maxFragmentUniformComponents;
GLuint maxFragmentUniformVectors;
GLuint maxFragmentUniformBlocks;
GLuint maxFragmentInputComponents;
GLuint maxTextureImageUnits;
GLint minProgramTexelOffset;
GLint maxProgramTexelOffset;
}; };
} }
......
...@@ -170,8 +170,6 @@ void Context::makeCurrent(egl::Surface *surface) ...@@ -170,8 +170,6 @@ void Context::makeCurrent(egl::Surface *surface)
{ {
if (!mHasBeenCurrent) if (!mHasBeenCurrent)
{ {
mSupportsVertexTexture = mRenderer->getVertexTextureSupport();
initRendererString(); initRendererString();
initExtensionStrings(); initExtensionStrings();
...@@ -899,16 +897,16 @@ void Context::getIntegerv(GLenum pname, GLint *params) ...@@ -899,16 +897,16 @@ void Context::getIntegerv(GLenum pname, GLint *params)
switch (pname) switch (pname)
{ {
case GL_MAX_VERTEX_ATTRIBS: *params = gl::MAX_VERTEX_ATTRIBS; break; case GL_MAX_VERTEX_ATTRIBS: *params = mCaps.maxVertexAttributes; break;
case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = mRenderer->getMaxVertexUniformVectors(); break; case GL_MAX_VERTEX_UNIFORM_VECTORS: *params = mCaps.maxVertexUniformVectors; break;
case GL_MAX_VERTEX_UNIFORM_COMPONENTS: *params = mRenderer->getMaxVertexUniformVectors() * 4; 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 = mRenderer->getMaxVaryingVectors(); break;
case GL_MAX_VARYING_COMPONENTS: *params = mRenderer->getMaxVaryingVectors() * 4; 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_COMBINED_TEXTURE_IMAGE_UNITS: *params = mRenderer->getMaxCombinedTextureImageUnits(); break;
case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = mRenderer->getMaxVertexTextureImageUnits(); break; case GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS: *params = mCaps.maxVertexTextureImageUnits; break;
case GL_MAX_TEXTURE_IMAGE_UNITS: *params = gl::MAX_TEXTURE_IMAGE_UNITS; break; case GL_MAX_TEXTURE_IMAGE_UNITS: *params = mCaps.maxTextureImageUnits; break;
case GL_MAX_FRAGMENT_UNIFORM_VECTORS: *params = mRenderer->getMaxFragmentUniformVectors(); break; case GL_MAX_FRAGMENT_UNIFORM_VECTORS: *params = mCaps.maxFragmentUniformVectors; break;
case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: *params = mRenderer->getMaxFragmentUniformVectors() * 4; break; case GL_MAX_FRAGMENT_UNIFORM_COMPONENTS: *params = mCaps.maxFragmentInputComponents; break;
case GL_MAX_RENDERBUFFER_SIZE: *params = mCaps.maxRenderbufferSize; break; case GL_MAX_RENDERBUFFER_SIZE: *params = mCaps.maxRenderbufferSize; break;
case GL_MAX_COLOR_ATTACHMENTS_EXT: *params = mCaps.maxColorAttachments; break; case GL_MAX_COLOR_ATTACHMENTS_EXT: *params = mCaps.maxColorAttachments; break;
case GL_MAX_DRAW_BUFFERS_EXT: *params = mCaps.maxDrawBuffers; break; case GL_MAX_DRAW_BUFFERS_EXT: *params = mCaps.maxDrawBuffers; break;
...@@ -920,8 +918,8 @@ void Context::getIntegerv(GLenum pname, GLint *params) ...@@ -920,8 +918,8 @@ void Context::getIntegerv(GLenum pname, GLint *params)
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 = getUniformBufferOffsetAlignment(); break;
case GL_MAX_UNIFORM_BUFFER_BINDINGS: *params = getMaximumCombinedUniformBufferBindings(); break; case GL_MAX_UNIFORM_BUFFER_BINDINGS: *params = getMaximumCombinedUniformBufferBindings(); break;
case GL_MAX_VERTEX_UNIFORM_BLOCKS: *params = mRenderer->getMaxVertexShaderUniformBuffers(); break; case GL_MAX_VERTEX_UNIFORM_BLOCKS: *params = mCaps.maxVertexUniformBlocks; break;
case GL_MAX_FRAGMENT_UNIFORM_BLOCKS: *params = mRenderer->getMaxFragmentShaderUniformBuffers(); 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 = getMaximumCombinedUniformBufferBindings(); 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;
...@@ -990,15 +988,15 @@ void Context::getInteger64v(GLenum pname, GLint64 *params) ...@@ -990,15 +988,15 @@ void Context::getInteger64v(GLenum pname, GLint64 *params)
break; break;
case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS: case GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS:
{ {
GLint64 uniformBufferComponents = static_cast<GLint64>(mRenderer->getMaxVertexShaderUniformBuffers()) * static_cast<GLint64>(mRenderer->getMaxUniformBufferSize() / 4); GLint64 uniformBufferComponents = static_cast<GLint64>(mCaps.maxVertexUniformBlocks) * static_cast<GLint64>(mRenderer->getMaxUniformBufferSize() / 4);
GLint64 defaultBufferComponents = static_cast<GLint64>(mRenderer->getMaxVertexUniformVectors() * 4); GLint64 defaultBufferComponents = static_cast<GLint64>(mCaps.maxVertexUniformComponents);
*params = uniformBufferComponents + defaultBufferComponents; *params = uniformBufferComponents + defaultBufferComponents;
} }
break; break;
case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS: case GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS:
{ {
GLint64 uniformBufferComponents = static_cast<GLint64>(mRenderer->getMaxFragmentShaderUniformBuffers()) * static_cast<GLint64>(mRenderer->getMaxUniformBufferSize() / 4); GLint64 uniformBufferComponents = static_cast<GLint64>(mCaps.maxFragmentUniformBlocks) * static_cast<GLint64>(mRenderer->getMaxUniformBufferSize() / 4);
GLint64 defaultBufferComponents = static_cast<GLint64>(mRenderer->getMaxVertexUniformVectors() * 4); GLint64 defaultBufferComponents = static_cast<GLint64>(mCaps.maxFragmentUniformComponents);
*params = uniformBufferComponents + defaultBufferComponents; *params = uniformBufferComponents + defaultBufferComponents;
} }
break; break;
...@@ -1459,8 +1457,8 @@ void Context::applyTextures(SamplerType shaderType, Texture *textures[], Texture ...@@ -1459,8 +1457,8 @@ void Context::applyTextures(SamplerType shaderType, Texture *textures[], Texture
size_t framebufferSerialCount) size_t framebufferSerialCount)
{ {
// Range of Direct3D samplers of given sampler type // Range of Direct3D samplers of given sampler type
size_t samplerCount = (shaderType == SAMPLER_PIXEL) ? MAX_TEXTURE_IMAGE_UNITS size_t samplerCount = (shaderType == SAMPLER_PIXEL) ? mCaps.maxTextureImageUnits
: mRenderer->getMaxVertexTextureImageUnits(); : mCaps.maxVertexTextureImageUnits;
for (size_t samplerIndex = 0; samplerIndex < textureCount; samplerIndex++) for (size_t samplerIndex = 0; samplerIndex < textureCount; samplerIndex++)
{ {
...@@ -1921,8 +1919,7 @@ unsigned int Context::getMaximumCombinedTextureImageUnits() const ...@@ -1921,8 +1919,7 @@ unsigned int Context::getMaximumCombinedTextureImageUnits() const
unsigned int Context::getMaximumCombinedUniformBufferBindings() const unsigned int Context::getMaximumCombinedUniformBufferBindings() const
{ {
return mRenderer->getMaxVertexShaderUniformBuffers() + return mCaps.maxVertexUniformBlocks + mCaps.maxFragmentUniformBlocks;
mRenderer->getMaxFragmentShaderUniformBuffers();
} }
unsigned int Context::getMaxTransformFeedbackBufferBindings() const unsigned int Context::getMaxTransformFeedbackBufferBindings() const
...@@ -2400,6 +2397,15 @@ void Context::initCaps(GLuint clientVersion) ...@@ -2400,6 +2397,15 @@ void Context::initCaps(GLuint clientVersion)
//mExtensions.sRGB = false; //mExtensions.sRGB = false;
} }
// Apply implementation limits
mCaps.maxVertexAttributes = std::min<GLuint>(mCaps.maxVertexAttributes, MAX_VERTEX_ATTRIBS);
mCaps.maxVertexTextureImageUnits = std::min<GLuint>(mCaps.maxVertexTextureImageUnits, IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS);
mCaps.maxVertexUniformBlocks = std::min<GLuint>(mCaps.maxVertexUniformBlocks, IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS);
mCaps.maxVertexOutputComponents = std::min<GLuint>(mCaps.maxVertexOutputComponents, 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);
GLuint maxSamples = 0; GLuint maxSamples = 0;
mCaps.compressedTextureFormats.clear(); mCaps.compressedTextureFormats.clear();
......
...@@ -323,8 +323,6 @@ class Context ...@@ -323,8 +323,6 @@ class Context
GLenum mResetStrategy; GLenum mResetStrategy;
bool mRobustAccess; bool mRobustAccess;
bool mSupportsVertexTexture;
ResourceManager *mResourceManager; ResourceManager *mResourceManager;
}; };
} }
......
...@@ -1046,7 +1046,7 @@ bool ProgramBinary::applyUniformBuffers(const std::vector<gl::Buffer*> boundBuff ...@@ -1046,7 +1046,7 @@ bool ProgramBinary::applyUniformBuffers(const std::vector<gl::Buffer*> boundBuff
{ {
unsigned int registerIndex = uniformBlock->vsRegisterIndex - reservedBuffersInVS; unsigned int registerIndex = uniformBlock->vsRegisterIndex - reservedBuffersInVS;
ASSERT(vertexUniformBuffers[registerIndex] == NULL); ASSERT(vertexUniformBuffers[registerIndex] == NULL);
ASSERT(registerIndex < mRenderer->getMaxVertexShaderUniformBuffers()); ASSERT(registerIndex < mRenderer->getRendererCaps().maxVertexUniformBlocks);
vertexUniformBuffers[registerIndex] = uniformBuffer; vertexUniformBuffers[registerIndex] = uniformBuffer;
} }
...@@ -1054,7 +1054,7 @@ bool ProgramBinary::applyUniformBuffers(const std::vector<gl::Buffer*> boundBuff ...@@ -1054,7 +1054,7 @@ bool ProgramBinary::applyUniformBuffers(const std::vector<gl::Buffer*> boundBuff
{ {
unsigned int registerIndex = uniformBlock->psRegisterIndex - reservedBuffersInFS; unsigned int registerIndex = uniformBlock->psRegisterIndex - reservedBuffersInFS;
ASSERT(fragmentUniformBuffers[registerIndex] == NULL); ASSERT(fragmentUniformBuffers[registerIndex] == NULL);
ASSERT(registerIndex < mRenderer->getMaxFragmentShaderUniformBuffers()); ASSERT(registerIndex < mRenderer->getRendererCaps().maxFragmentUniformBlocks);
fragmentUniformBuffers[registerIndex] = uniformBuffer; fragmentUniformBuffers[registerIndex] = uniformBuffer;
} }
} }
...@@ -2039,22 +2039,22 @@ bool ProgramBinary::indexSamplerUniform(const LinkedUniform &uniform, InfoLog &i ...@@ -2039,22 +2039,22 @@ bool ProgramBinary::indexSamplerUniform(const LinkedUniform &uniform, InfoLog &i
ASSERT(IsSampler(uniform.type)); ASSERT(IsSampler(uniform.type));
ASSERT(uniform.vsRegisterIndex != GL_INVALID_INDEX || uniform.psRegisterIndex != GL_INVALID_INDEX); ASSERT(uniform.vsRegisterIndex != GL_INVALID_INDEX || uniform.psRegisterIndex != GL_INVALID_INDEX);
const gl::Caps &caps = mRenderer->getRendererCaps();
if (uniform.vsRegisterIndex != GL_INVALID_INDEX) if (uniform.vsRegisterIndex != GL_INVALID_INDEX)
{ {
if (!assignSamplers(uniform.vsRegisterIndex, uniform.type, uniform.arraySize, mSamplersVS, if (!assignSamplers(uniform.vsRegisterIndex, uniform.type, uniform.arraySize, mSamplersVS,
&mUsedVertexSamplerRange, mRenderer->getMaxVertexTextureImageUnits())) &mUsedVertexSamplerRange, caps.maxVertexTextureImageUnits))
{ {
infoLog.append("Vertex shader sampler count exceeds the maximum vertex texture units (%d).", infoLog.append("Vertex shader sampler count exceeds the maximum vertex texture units (%d).",
mRenderer->getMaxVertexTextureImageUnits()); caps.maxVertexTextureImageUnits);
return false; return false;
} }
unsigned int maxVertexVectors = mRenderer->getReservedVertexUniformVectors() + unsigned int maxVertexVectors = mRenderer->getReservedVertexUniformVectors() + caps.maxVertexUniformVectors;
mRenderer->getMaxVertexUniformVectors();
if (uniform.vsRegisterIndex + uniform.registerCount > maxVertexVectors) if (uniform.vsRegisterIndex + uniform.registerCount > maxVertexVectors)
{ {
infoLog.append("Vertex shader active uniforms exceed GL_MAX_VERTEX_UNIFORM_VECTORS (%u)", infoLog.append("Vertex shader active uniforms exceed GL_MAX_VERTEX_UNIFORM_VECTORS (%u)",
mRenderer->getMaxVertexUniformVectors()); caps.maxVertexUniformVectors);
return false; return false;
} }
} }
...@@ -2062,19 +2062,18 @@ bool ProgramBinary::indexSamplerUniform(const LinkedUniform &uniform, InfoLog &i ...@@ -2062,19 +2062,18 @@ bool ProgramBinary::indexSamplerUniform(const LinkedUniform &uniform, InfoLog &i
if (uniform.psRegisterIndex != GL_INVALID_INDEX) if (uniform.psRegisterIndex != GL_INVALID_INDEX)
{ {
if (!assignSamplers(uniform.psRegisterIndex, uniform.type, uniform.arraySize, mSamplersPS, if (!assignSamplers(uniform.psRegisterIndex, uniform.type, uniform.arraySize, mSamplersPS,
&mUsedPixelSamplerRange, MAX_TEXTURE_IMAGE_UNITS)) &mUsedPixelSamplerRange, caps.maxTextureImageUnits))
{ {
infoLog.append("Pixel shader sampler count exceeds MAX_TEXTURE_IMAGE_UNITS (%d).", infoLog.append("Pixel shader sampler count exceeds MAX_TEXTURE_IMAGE_UNITS (%d).",
MAX_TEXTURE_IMAGE_UNITS); caps.maxTextureImageUnits);
return false; return false;
} }
unsigned int maxFragmentVectors = mRenderer->getReservedFragmentUniformVectors() + unsigned int maxFragmentVectors = mRenderer->getReservedFragmentUniformVectors() + caps.maxFragmentUniformVectors;
mRenderer->getMaxFragmentUniformVectors();
if (uniform.psRegisterIndex + uniform.registerCount > maxFragmentVectors) if (uniform.psRegisterIndex + uniform.registerCount > maxFragmentVectors)
{ {
infoLog.append("Fragment shader active uniforms exceed GL_MAX_FRAGMENT_UNIFORM_VECTORS (%u)", infoLog.append("Fragment shader active uniforms exceed GL_MAX_FRAGMENT_UNIFORM_VECTORS (%u)",
mRenderer->getMaxFragmentUniformVectors()); caps.maxFragmentUniformVectors);
return false; return false;
} }
} }
...@@ -2389,25 +2388,22 @@ bool ProgramBinary::defineUniformBlock(InfoLog &infoLog, const Shader &shader, c ...@@ -2389,25 +2388,22 @@ bool ProgramBinary::defineUniformBlock(InfoLog &infoLog, const Shader &shader, c
bool ProgramBinary::assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex) bool ProgramBinary::assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex)
{ {
const gl::Caps &caps = mRenderer->getRendererCaps();
if (shader == GL_VERTEX_SHADER) if (shader == GL_VERTEX_SHADER)
{ {
uniformBlock->vsRegisterIndex = registerIndex; uniformBlock->vsRegisterIndex = registerIndex;
unsigned int maximumBlocks = mRenderer->getMaxVertexShaderUniformBuffers(); if (registerIndex - mRenderer->getReservedVertexUniformBuffers() >= caps.maxVertexUniformBlocks)
if (registerIndex - mRenderer->getReservedVertexUniformBuffers() >= maximumBlocks)
{ {
infoLog.append("Vertex shader uniform block count exceed GL_MAX_VERTEX_UNIFORM_BLOCKS (%u)", maximumBlocks); infoLog.append("Vertex shader uniform block count exceed GL_MAX_VERTEX_UNIFORM_BLOCKS (%u)", caps.maxVertexUniformBlocks);
return false; return false;
} }
} }
else if (shader == GL_FRAGMENT_SHADER) else if (shader == GL_FRAGMENT_SHADER)
{ {
uniformBlock->psRegisterIndex = registerIndex; uniformBlock->psRegisterIndex = registerIndex;
unsigned int maximumBlocks = mRenderer->getMaxFragmentShaderUniformBuffers(); if (registerIndex - mRenderer->getReservedFragmentUniformBuffers() >= caps.maxFragmentUniformBlocks)
if (registerIndex - mRenderer->getReservedFragmentUniformBuffers() >= maximumBlocks)
{ {
infoLog.append("Fragment shader uniform block count exceed GL_MAX_FRAGMENT_UNIFORM_BLOCKS (%u)", maximumBlocks); infoLog.append("Fragment shader uniform block count exceed GL_MAX_FRAGMENT_UNIFORM_BLOCKS (%u)", caps.maxFragmentUniformBlocks);
return false; return false;
} }
} }
......
...@@ -208,13 +208,13 @@ void Shader::initializeCompiler() ...@@ -208,13 +208,13 @@ void Shader::initializeCompiler()
const gl::Caps &caps = mRenderer->getRendererCaps(); const gl::Caps &caps = mRenderer->getRendererCaps();
const gl::Extensions &extensions = mRenderer->getRendererExtensions(); const gl::Extensions &extensions = mRenderer->getRendererExtensions();
resources.MaxVertexAttribs = MAX_VERTEX_ATTRIBS; resources.MaxVertexAttribs = caps.maxVertexAttributes;
resources.MaxVertexUniformVectors = mRenderer->getMaxVertexUniformVectors(); resources.MaxVertexUniformVectors = caps.maxVertexUniformVectors;
resources.MaxVaryingVectors = mRenderer->getMaxVaryingVectors(); resources.MaxVaryingVectors = mRenderer->getMaxVaryingVectors();
resources.MaxVertexTextureImageUnits = mRenderer->getMaxVertexTextureImageUnits(); resources.MaxVertexTextureImageUnits = caps.maxVertexTextureImageUnits;
resources.MaxCombinedTextureImageUnits = mRenderer->getMaxCombinedTextureImageUnits(); resources.MaxCombinedTextureImageUnits = mRenderer->getMaxCombinedTextureImageUnits();
resources.MaxTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS; resources.MaxTextureImageUnits = caps.maxTextureImageUnits;
resources.MaxFragmentUniformVectors = mRenderer->getMaxFragmentUniformVectors(); resources.MaxFragmentUniformVectors = caps.maxFragmentUniformVectors;
resources.MaxDrawBuffers = caps.maxDrawBuffers; resources.MaxDrawBuffers = caps.maxDrawBuffers;
resources.OES_standard_derivatives = extensions.standardDerivatives; resources.OES_standard_derivatives = extensions.standardDerivatives;
resources.EXT_draw_buffers = extensions.drawBuffers; resources.EXT_draw_buffers = extensions.drawBuffers;
...@@ -223,10 +223,10 @@ void Shader::initializeCompiler() ...@@ -223,10 +223,10 @@ void Shader::initializeCompiler()
resources.FragmentPrecisionHigh = 1; // Shader Model 2+ always supports FP24 (s16e7) which corresponds to highp resources.FragmentPrecisionHigh = 1; // Shader Model 2+ always supports FP24 (s16e7) which corresponds to highp
resources.EXT_frag_depth = 1; // Shader Model 2+ always supports explicit depth output resources.EXT_frag_depth = 1; // Shader Model 2+ always supports explicit depth output
// GLSL ES 3.0 constants // GLSL ES 3.0 constants
resources.MaxVertexOutputVectors = mRenderer->getMaxVaryingVectors(); resources.MaxVertexOutputVectors = caps.maxVertexOutputComponents / 4;
resources.MaxFragmentInputVectors = mRenderer->getMaxVaryingVectors(); resources.MaxFragmentInputVectors = caps.maxFragmentInputComponents / 4;
resources.MinProgramTexelOffset = -8; // D3D10_COMMONSHADER_TEXEL_OFFSET_MAX_NEGATIVE resources.MinProgramTexelOffset = caps.minProgramTexelOffset;
resources.MaxProgramTexelOffset = 7; // D3D10_COMMONSHADER_TEXEL_OFFSET_MAX_POSITIVE resources.MaxProgramTexelOffset = caps.maxProgramTexelOffset;
mFragmentCompiler = ShConstructCompiler(GL_FRAGMENT_SHADER, SH_GLES2_SPEC, hlslVersion, &resources); mFragmentCompiler = ShConstructCompiler(GL_FRAGMENT_SHADER, SH_GLES2_SPEC, hlslVersion, &resources);
mVertexCompiler = ShConstructCompiler(GL_VERTEX_SHADER, SH_GLES2_SPEC, hlslVersion, &resources); mVertexCompiler = ShConstructCompiler(GL_VERTEX_SHADER, SH_GLES2_SPEC, hlslVersion, &resources);
......
...@@ -153,16 +153,10 @@ class Renderer ...@@ -153,16 +153,10 @@ class Renderer
virtual std::string getRendererDescription() const = 0; virtual std::string getRendererDescription() const = 0;
virtual GUID getAdapterIdentifier() const = 0; virtual GUID getAdapterIdentifier() const = 0;
bool getVertexTextureSupport() const { return getMaxVertexTextureImageUnits() > 0; }
virtual unsigned int getMaxVertexTextureImageUnits() const = 0;
virtual unsigned int getMaxCombinedTextureImageUnits() 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 getMaxVertexUniformVectors() const = 0;
virtual unsigned int getMaxFragmentUniformVectors() const = 0;
virtual unsigned int getMaxVaryingVectors() const = 0; virtual unsigned int getMaxVaryingVectors() const = 0;
virtual unsigned int getMaxVertexShaderUniformBuffers() const = 0;
virtual unsigned int getMaxFragmentShaderUniformBuffers() 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;
......
...@@ -415,11 +415,7 @@ void Renderer11::setSamplerState(gl::SamplerType type, int index, const gl::Samp ...@@ -415,11 +415,7 @@ void Renderer11::setSamplerState(gl::SamplerType type, int index, const gl::Samp
{ {
if (type == gl::SAMPLER_PIXEL) if (type == gl::SAMPLER_PIXEL)
{ {
if (index < 0 || index >= gl::MAX_TEXTURE_IMAGE_UNITS) ASSERT(static_cast<unsigned int>(index) < getRendererCaps().maxTextureImageUnits);
{
ERR("Pixel shader sampler index %i is not valid.", index);
return;
}
if (mForceSetPixelSamplerStates[index] || memcmp(&samplerState, &mCurPixelSamplerStates[index], sizeof(gl::SamplerState)) != 0) if (mForceSetPixelSamplerStates[index] || memcmp(&samplerState, &mCurPixelSamplerStates[index], sizeof(gl::SamplerState)) != 0)
{ {
...@@ -440,11 +436,7 @@ void Renderer11::setSamplerState(gl::SamplerType type, int index, const gl::Samp ...@@ -440,11 +436,7 @@ void Renderer11::setSamplerState(gl::SamplerType type, int index, const gl::Samp
} }
else if (type == gl::SAMPLER_VERTEX) else if (type == gl::SAMPLER_VERTEX)
{ {
if (index < 0 || index >= (int)getMaxVertexTextureImageUnits()) ASSERT(static_cast<unsigned int>(index) < getRendererCaps().maxVertexTextureImageUnits);
{
ERR("Vertex shader sampler index %i is not valid.", index);
return;
}
if (mForceSetVertexSamplerStates[index] || memcmp(&samplerState, &mCurVertexSamplerStates[index], sizeof(gl::SamplerState)) != 0) if (mForceSetVertexSamplerStates[index] || memcmp(&samplerState, &mCurVertexSamplerStates[index], sizeof(gl::SamplerState)) != 0)
{ {
...@@ -494,11 +486,7 @@ void Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *textur ...@@ -494,11 +486,7 @@ void Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *textur
if (type == gl::SAMPLER_PIXEL) if (type == gl::SAMPLER_PIXEL)
{ {
if (index < 0 || index >= gl::MAX_TEXTURE_IMAGE_UNITS) ASSERT(static_cast<unsigned int>(index) < getRendererCaps().maxTextureImageUnits);
{
ERR("Pixel shader sampler index %i is not valid.", index);
return;
}
if (forceSetTexture || mCurPixelSRVs[index] != textureSRV) if (forceSetTexture || mCurPixelSRVs[index] != textureSRV)
{ {
...@@ -509,11 +497,7 @@ void Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *textur ...@@ -509,11 +497,7 @@ void Renderer11::setTexture(gl::SamplerType type, int index, gl::Texture *textur
} }
else if (type == gl::SAMPLER_VERTEX) else if (type == gl::SAMPLER_VERTEX)
{ {
if (index < 0 || index >= (int)getMaxVertexTextureImageUnits()) ASSERT(static_cast<unsigned int>(index) < getRendererCaps().maxVertexTextureImageUnits);
{
ERR("Vertex shader sampler index %i is not valid.", index);
return;
}
if (forceSetTexture || mCurVertexSRVs[index] != textureSRV) if (forceSetTexture || mCurVertexSRVs[index] != textureSRV)
{ {
...@@ -1781,23 +1765,9 @@ GUID Renderer11::getAdapterIdentifier() const ...@@ -1781,23 +1765,9 @@ GUID Renderer11::getAdapterIdentifier() const
return adapterId; return adapterId;
} }
unsigned int Renderer11::getMaxVertexTextureImageUnits() const
{
META_ASSERT(MAX_TEXTURE_IMAGE_UNITS_VTF_SM4 <= gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS);
switch (mFeatureLevel)
{
case D3D_FEATURE_LEVEL_11_0:
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0:
return MAX_TEXTURE_IMAGE_UNITS_VTF_SM4;
default: UNREACHABLE();
return 0;
}
}
unsigned int Renderer11::getMaxCombinedTextureImageUnits() const unsigned int Renderer11::getMaxCombinedTextureImageUnits() const
{ {
return gl::MAX_TEXTURE_IMAGE_UNITS + getMaxVertexTextureImageUnits(); return getRendererCaps().maxTextureImageUnits + getRendererCaps().maxVertexTextureImageUnits;
} }
unsigned int Renderer11::getReservedVertexUniformVectors() const unsigned int Renderer11::getReservedVertexUniformVectors() const
...@@ -1810,20 +1780,6 @@ unsigned int Renderer11::getReservedFragmentUniformVectors() const ...@@ -1810,20 +1780,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::getMaxVertexUniformVectors() const
{
META_ASSERT(MAX_VERTEX_UNIFORM_VECTORS_D3D11 <= D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT);
ASSERT(mFeatureLevel >= D3D_FEATURE_LEVEL_10_0);
return MAX_VERTEX_UNIFORM_VECTORS_D3D11;
}
unsigned int Renderer11::getMaxFragmentUniformVectors() const
{
META_ASSERT(MAX_FRAGMENT_UNIFORM_VECTORS_D3D11 <= D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT);
ASSERT(mFeatureLevel >= D3D_FEATURE_LEVEL_10_0);
return MAX_FRAGMENT_UNIFORM_VECTORS_D3D11;
}
unsigned int Renderer11::getMaxVaryingVectors() const unsigned int Renderer11::getMaxVaryingVectors() const
{ {
META_ASSERT(gl::IMPLEMENTATION_MAX_VARYING_VECTORS == D3D11_VS_OUTPUT_REGISTER_COUNT); META_ASSERT(gl::IMPLEMENTATION_MAX_VARYING_VECTORS == D3D11_VS_OUTPUT_REGISTER_COUNT);
...@@ -1842,40 +1798,6 @@ unsigned int Renderer11::getMaxVaryingVectors() const ...@@ -1842,40 +1798,6 @@ unsigned int Renderer11::getMaxVaryingVectors() const
} }
} }
unsigned int Renderer11::getMaxVertexShaderUniformBuffers() const
{
META_ASSERT(gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS >= D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT &&
gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS >= D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT);
switch (mFeatureLevel)
{
case D3D_FEATURE_LEVEL_11_0:
return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - getReservedVertexUniformBuffers();
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0:
return D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - getReservedVertexUniformBuffers();
default: UNREACHABLE();
return 0;
}
}
unsigned int Renderer11::getMaxFragmentShaderUniformBuffers() const
{
META_ASSERT(gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS >= D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT &&
gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS >= D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT);
switch (mFeatureLevel)
{
case D3D_FEATURE_LEVEL_11_0:
return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - getReservedFragmentUniformBuffers();
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0:
return D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - getReservedFragmentUniformBuffers();
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
......
...@@ -103,15 +103,10 @@ class Renderer11 : public Renderer ...@@ -103,15 +103,10 @@ 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 getMaxVertexTextureImageUnits() const;
virtual unsigned int getMaxCombinedTextureImageUnits() 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 getMaxVertexUniformVectors() const;
virtual unsigned int getMaxFragmentUniformVectors() const;
virtual unsigned int getMaxVaryingVectors() const; virtual unsigned int getMaxVaryingVectors() const;
virtual unsigned int getMaxVertexShaderUniformBuffers() const;
virtual unsigned int getMaxFragmentShaderUniformBuffers() 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; unsigned int getReservedVaryings() const;
......
...@@ -537,6 +537,234 @@ static size_t GetMaximumDrawVertexCount(D3D_FEATURE_LEVEL featureLevel) ...@@ -537,6 +537,234 @@ static size_t GetMaximumDrawVertexCount(D3D_FEATURE_LEVEL featureLevel)
} }
} }
static size_t GetMaximumVertexInputSlots(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0: return D3D11_STANDARD_VERTEX_ELEMENT_COUNT;
case D3D_FEATURE_LEVEL_10_1: return D3D10_1_STANDARD_VERTEX_ELEMENT_COUNT;
case D3D_FEATURE_LEVEL_10_0: return D3D10_STANDARD_VERTEX_ELEMENT_COUNT;
// From http://http://msdn.microsoft.com/en-us/library/windows/desktop/ff476876.aspx "Max Input Slots"
case D3D_FEATURE_LEVEL_9_3:
case D3D_FEATURE_LEVEL_9_2:
case D3D_FEATURE_LEVEL_9_1: return 16;
default: UNREACHABLE(); return 0;
}
}
static size_t GetMaximumVertexUniformVectors(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0: return D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT;
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0: return D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT;
// From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476149.aspx ID3D11DeviceContext::VSSetConstantBuffers
case D3D_FEATURE_LEVEL_9_3:
case D3D_FEATURE_LEVEL_9_2:
case D3D_FEATURE_LEVEL_9_1: return 255;
default: UNREACHABLE(); return 0;
}
}
static size_t GetReservedVertexUniformBuffers()
{
// Reserve one buffer for the application uniforms, and one for driver uniforms
return 2;
}
static size_t GetMaximumVertexUniformBlocks(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0: return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - GetReservedVertexUniformBuffers();
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0: return D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - GetReservedVertexUniformBuffers();
// Uniform blocks not supported in D3D9 feature levels
case D3D_FEATURE_LEVEL_9_3:
case D3D_FEATURE_LEVEL_9_2:
case D3D_FEATURE_LEVEL_9_1: return 0;
default: UNREACHABLE(); return 0;
}
}
static size_t GetReservedVertexOutputVectors()
{
// We potentially reserve varyings for gl_Position, dx_Position, gl_FragCoord and gl_PointSize
return 4;
}
static size_t GetMaximumVertexOutputVectors(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0: return D3D11_VS_OUTPUT_REGISTER_COUNT - GetReservedVertexOutputVectors();
case D3D_FEATURE_LEVEL_10_1: return D3D10_1_VS_OUTPUT_REGISTER_COUNT - GetReservedVertexOutputVectors();
case D3D_FEATURE_LEVEL_10_0: return D3D10_VS_OUTPUT_REGISTER_COUNT - GetReservedVertexOutputVectors();
// Use D3D9 SM3 and SM2 limits
case D3D_FEATURE_LEVEL_9_3: return 10 - GetReservedVertexOutputVectors();
case D3D_FEATURE_LEVEL_9_2:
case D3D_FEATURE_LEVEL_9_1: return 8 - GetReservedVertexOutputVectors();
default: UNREACHABLE(); return 0;
}
}
static size_t GetMaximumVertexTextureUnits(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0: return D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT;
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0: return D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT;
// Vertex textures not supported in D3D9 feature levels according to
// http://msdn.microsoft.com/en-us/library/windows/desktop/ff476149.aspx
// ID3D11DeviceContext::VSSetSamplers and ID3D11DeviceContext::VSSetShaderResources
case D3D_FEATURE_LEVEL_9_3:
case D3D_FEATURE_LEVEL_9_2:
case D3D_FEATURE_LEVEL_9_1: return 0;
default: UNREACHABLE(); return 0;
}
}
static size_t GetMaximumPixelUniformVectors(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0: return D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT;
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0: return D3D10_REQ_CONSTANT_BUFFER_ELEMENT_COUNT;
// From http://msdn.microsoft.com/en-us/library/windows/desktop/ff476149.aspx ID3D11DeviceContext::PSSetConstantBuffers
case D3D_FEATURE_LEVEL_9_3:
case D3D_FEATURE_LEVEL_9_2:
case D3D_FEATURE_LEVEL_9_1: return 32;
default: UNREACHABLE(); return 0;
}
}
static size_t GetReservedPixelUniformBuffers()
{
// Reserve one buffer for the application uniforms, and one for driver uniforms
return 2;
}
static size_t GetMaximumPixelUniformBlocks(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0: return D3D11_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - GetReservedPixelUniformBuffers();
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0: return D3D10_COMMONSHADER_CONSTANT_BUFFER_API_SLOT_COUNT - GetReservedPixelUniformBuffers();
// Uniform blocks not supported in D3D9 feature levels
case D3D_FEATURE_LEVEL_9_3:
case D3D_FEATURE_LEVEL_9_2:
case D3D_FEATURE_LEVEL_9_1: return 0;
default: UNREACHABLE(); return 0;
}
}
static size_t GetMaximumPixelInputVectors(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0: return D3D11_PS_INPUT_REGISTER_COUNT - GetReservedVertexOutputVectors();
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0: return D3D10_PS_INPUT_REGISTER_COUNT - GetReservedVertexOutputVectors();
// Use D3D9 SM3 and SM2 limits
case D3D_FEATURE_LEVEL_9_3: return 10 - GetReservedVertexOutputVectors();
case D3D_FEATURE_LEVEL_9_2:
case D3D_FEATURE_LEVEL_9_1: return 8 - GetReservedVertexOutputVectors();
default: UNREACHABLE(); return 0;
}
}
static size_t GetMaximumPixelTextureUnits(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0: return D3D11_COMMONSHADER_SAMPLER_SLOT_COUNT;
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0: return D3D10_COMMONSHADER_SAMPLER_SLOT_COUNT;
// http://msdn.microsoft.com/en-us/library/windows/desktop/ff476149.aspx ID3D11DeviceContext::PSSetShaderResources
case D3D_FEATURE_LEVEL_9_3:
case D3D_FEATURE_LEVEL_9_2:
case D3D_FEATURE_LEVEL_9_1: return 16;
default: UNREACHABLE(); return 0;
}
}
static int GetMinimumTexelOffset(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0: return D3D11_COMMONSHADER_TEXEL_OFFSET_MAX_NEGATIVE;
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0: return D3D10_COMMONSHADER_TEXEL_OFFSET_MAX_NEGATIVE;
// Sampling functions with offsets are not available below shader model 4.0.
case D3D_FEATURE_LEVEL_9_3:
case D3D_FEATURE_LEVEL_9_2:
case D3D_FEATURE_LEVEL_9_1: return 0;
default: UNREACHABLE(); return 0;
}
}
static int GetMaximumTexelOffset(D3D_FEATURE_LEVEL featureLevel)
{
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0: return D3D11_COMMONSHADER_TEXEL_OFFSET_MAX_POSITIVE;
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0: return D3D11_COMMONSHADER_TEXEL_OFFSET_MAX_POSITIVE;
// Sampling functions with offsets are not available below shader model 4.0.
case D3D_FEATURE_LEVEL_9_3:
case D3D_FEATURE_LEVEL_9_2:
case D3D_FEATURE_LEVEL_9_1: return 0;
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;
...@@ -596,6 +824,23 @@ void GenerateCaps(ID3D11Device *device, gl::Caps *caps, gl::TextureCapsMap *text ...@@ -596,6 +824,23 @@ void GenerateCaps(ID3D11Device *device, gl::Caps *caps, gl::TextureCapsMap *text
// We do not wait for server fence objects internally, so report a max timeout of zero. // We do not wait for server fence objects internally, so report a max timeout of zero.
caps->maxServerWaitTimeout = 0; caps->maxServerWaitTimeout = 0;
// Vertex shader limits
caps->maxVertexAttributes = GetMaximumVertexInputSlots(featureLevel);
caps->maxVertexUniformComponents = GetMaximumVertexUniformVectors(featureLevel) * 4;
caps->maxVertexUniformVectors = GetMaximumVertexUniformVectors(featureLevel);
caps->maxVertexUniformBlocks = GetMaximumVertexUniformBlocks(featureLevel);
caps->maxVertexOutputComponents = GetMaximumVertexOutputVectors(featureLevel) * 4;
caps->maxVertexTextureImageUnits = GetMaximumVertexTextureUnits(featureLevel);
// Fragment shader limits
caps->maxFragmentUniformComponents = GetMaximumPixelUniformVectors(featureLevel) * 4;
caps->maxFragmentUniformVectors = GetMaximumPixelUniformVectors(featureLevel);
caps->maxFragmentUniformBlocks = GetMaximumPixelUniformBlocks(featureLevel);
caps->maxFragmentInputComponents = GetMaximumPixelInputVectors(featureLevel) * 4;
caps->maxTextureImageUnits = GetMaximumPixelTextureUnits(featureLevel);
caps->minProgramTexelOffset = GetMinimumTexelOffset(featureLevel);
caps->maxProgramTexelOffset = GetMaximumTexelOffset(featureLevel);
// GL extension support // GL extension support
extensions->setTextureExtensionSupport(*textureCapsMap); extensions->setTextureExtensionSupport(*textureCapsMap);
extensions->elementIndexUint = true; extensions->elementIndexUint = true;
......
...@@ -2180,15 +2180,9 @@ GUID Renderer9::getAdapterIdentifier() const ...@@ -2180,15 +2180,9 @@ GUID Renderer9::getAdapterIdentifier() const
return mAdapterIdentifier.DeviceIdentifier; return mAdapterIdentifier.DeviceIdentifier;
} }
unsigned int Renderer9::getMaxVertexTextureImageUnits() const
{
META_ASSERT(MAX_TEXTURE_IMAGE_UNITS_VTF_SM3 <= gl::IMPLEMENTATION_MAX_VERTEX_TEXTURE_IMAGE_UNITS);
return mVertexTextureSupport ? MAX_TEXTURE_IMAGE_UNITS_VTF_SM3 : 0;
}
unsigned int Renderer9::getMaxCombinedTextureImageUnits() const unsigned int Renderer9::getMaxCombinedTextureImageUnits() const
{ {
return gl::MAX_TEXTURE_IMAGE_UNITS + getMaxVertexTextureImageUnits(); return getRendererCaps().maxTextureImageUnits + getRendererCaps().maxVertexTextureImageUnits;
} }
unsigned int Renderer9::getReservedVertexUniformVectors() const unsigned int Renderer9::getReservedVertexUniformVectors() const
...@@ -2201,33 +2195,11 @@ unsigned int Renderer9::getReservedFragmentUniformVectors() const ...@@ -2201,33 +2195,11 @@ 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::getMaxVertexUniformVectors() const
{
return MAX_VERTEX_CONSTANT_VECTORS_D3D9 - getReservedVertexUniformVectors();
}
unsigned int Renderer9::getMaxFragmentUniformVectors() const
{
const int maxPixelConstantVectors = (getMajorShaderModel() >= 3) ? MAX_PIXEL_CONSTANT_VECTORS_SM3 : MAX_PIXEL_CONSTANT_VECTORS_SM2;
return maxPixelConstantVectors - getReservedFragmentUniformVectors();
}
unsigned int Renderer9::getMaxVaryingVectors() const unsigned int Renderer9::getMaxVaryingVectors() const
{ {
return (getMajorShaderModel() >= 3) ? MAX_VARYING_VECTORS_SM3 : MAX_VARYING_VECTORS_SM2; return (getMajorShaderModel() >= 3) ? MAX_VARYING_VECTORS_SM3 : MAX_VARYING_VECTORS_SM2;
} }
unsigned int Renderer9::getMaxVertexShaderUniformBuffers() const
{
return 0;
}
unsigned int Renderer9::getMaxFragmentShaderUniformBuffers() const
{
return 0;
}
unsigned int Renderer9::getReservedVertexUniformBuffers() const unsigned int Renderer9::getReservedVertexUniformBuffers() const
{ {
return 0; return 0;
......
...@@ -105,15 +105,10 @@ class Renderer9 : public Renderer ...@@ -105,15 +105,10 @@ 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 getMaxVertexTextureImageUnits() const;
virtual unsigned int getMaxCombinedTextureImageUnits() 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 getMaxVertexUniformVectors() const;
virtual unsigned int getMaxFragmentUniformVectors() const;
virtual unsigned int getMaxVaryingVectors() const; virtual unsigned int getMaxVaryingVectors() const;
virtual unsigned int getMaxVertexShaderUniformBuffers() const;
virtual unsigned int getMaxFragmentShaderUniformBuffers() 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;
......
...@@ -382,6 +382,49 @@ void GenerateCaps(IDirect3D9 *d3d9, IDirect3DDevice9 *device, D3DDEVTYPE deviceT ...@@ -382,6 +382,49 @@ void GenerateCaps(IDirect3D9 *d3d9, IDirect3DDevice9 *device, D3DDEVTYPE deviceT
// WaitSync is ES3-only, set to zero // WaitSync is ES3-only, set to zero
caps->maxServerWaitTimeout = 0; caps->maxServerWaitTimeout = 0;
// Vertex shader limits
caps->maxVertexAttributes = 16;
const size_t reservedVertexUniformVectors = 2; // dx_ViewAdjust and dx_DepthRange.
const size_t MAX_VERTEX_CONSTANT_VECTORS_D3D9 = 256;
caps->maxVertexUniformVectors = MAX_VERTEX_CONSTANT_VECTORS_D3D9 - reservedVertexUniformVectors;
caps->maxVertexUniformComponents = caps->maxVertexUniformVectors * 4;
caps->maxVertexUniformBlocks = 0;
const size_t MAX_VERTEX_OUTPUT_VECTORS_SM3 = 10;
const size_t MAX_VERTEX_OUTPUT_VECTORS_SM2 = 8;
caps->maxVertexOutputComponents = ((deviceCaps.VertexShaderVersion >= D3DVS_VERSION(3, 0)) ? MAX_VERTEX_OUTPUT_VECTORS_SM3
: MAX_VERTEX_OUTPUT_VECTORS_SM2) * 4;
// Only Direct3D 10 ready devices support all the necessary vertex texture formats.
// We test this using D3D9 by checking support for the R16F format.
if (deviceCaps.VertexShaderVersion >= D3DVS_VERSION(3, 0) &&
SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, currentDisplayMode.Format,
D3DUSAGE_QUERY_VERTEXTEXTURE, D3DRTYPE_TEXTURE, D3DFMT_R16F)))
{
const size_t MAX_TEXTURE_IMAGE_UNITS_VTF_SM3 = 4;
caps->maxVertexTextureImageUnits = MAX_TEXTURE_IMAGE_UNITS_VTF_SM3;
}
else
{
caps->maxVertexTextureImageUnits = 0;
}
// Fragment shader limits
const size_t reservedPixelUniformVectors = 3; // dx_ViewCoords, dx_DepthFront and dx_DepthRange.
const size_t MAX_PIXEL_CONSTANT_VECTORS_SM3 = 224;
const size_t MAX_PIXEL_CONSTANT_VECTORS_SM2 = 32;
caps->maxFragmentUniformVectors = ((deviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0)) ? MAX_PIXEL_CONSTANT_VECTORS_SM3
: MAX_PIXEL_CONSTANT_VECTORS_SM2) - reservedPixelUniformVectors;
caps->maxFragmentUniformComponents = caps->maxFragmentUniformVectors * 4;
caps->maxFragmentUniformBlocks = 0;
caps->maxFragmentInputComponents = caps->maxVertexOutputComponents;
caps->maxTextureImageUnits = 16;
caps->minProgramTexelOffset = 0;
caps->maxProgramTexelOffset = 0;
// GL extension support // GL extension support
extensions->setTextureExtensionSupport(*textureCapsMap); extensions->setTextureExtensionSupport(*textureCapsMap);
extensions->elementIndexUint = deviceCaps.MaxVertexIndex >= (1 << 16); extensions->elementIndexUint = deviceCaps.MaxVertexIndex >= (1 << 16);
......
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