Commit 900013cd by Geoff Lang

Add caps from the 6.29 table.

BUG=angle:658 Change-Id: I392f581b1aea445d60f507c1fa897c4348c1a137 Reviewed-on: https://chromium-review.googlesource.com/207371Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 0f796ace
......@@ -380,7 +380,11 @@ Caps::Caps()
maxViewportHeight(0),
minAliasedPointSize(0),
maxAliasedPointSize(0),
minAliasedLineWidth(0)
minAliasedLineWidth(0),
// Table 6.29
maxElementsIndices(0),
maxElementsVertices(0),
maxServerWaitTimeout(0)
{
}
......
......@@ -226,6 +226,13 @@ struct Caps
GLfloat minAliasedLineWidth;
GLfloat maxAliasedLineWidth;
// Table 6.29, implementation dependent values (cont.)
GLuint maxElementsIndices;
GLuint maxElementsVertices;
std::vector<GLenum> compressedTextureFormats;
std::vector<GLenum> programBinaryFormats;
std::vector<GLenum> shaderBinaryFormats;
GLuint64 maxServerWaitTimeout;
};
}
......
......@@ -110,8 +110,6 @@ Context::Context(int clientVersion, const gl::Context *shareContext, rx::Rendere
mResetStrategy = (notifyResets ? GL_LOSE_CONTEXT_ON_RESET_EXT : GL_NO_RESET_NOTIFICATION_EXT);
mRobustAccess = robustAccess;
mNumCompressedTextureFormats = 0;
mState.setContext(this);
}
......@@ -174,20 +172,6 @@ void Context::makeCurrent(egl::Surface *surface)
{
mSupportsVertexTexture = mRenderer->getVertexTextureSupport();
mNumCompressedTextureFormats = 0;
if (mExtensions.textureCompressionDXT1)
{
mNumCompressedTextureFormats += 2;
}
if (mExtensions.textureCompressionDXT3)
{
mNumCompressedTextureFormats += 1;
}
if (mExtensions.textureCompressionDXT5)
{
mNumCompressedTextureFormats += 1;
}
initRendererString();
initExtensionStrings();
......@@ -681,11 +665,11 @@ void Context::linkProgram(GLuint program)
}
}
void Context::setProgramBinary(GLuint program, const void *binary, GLint length)
void Context::setProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLint length)
{
Program *programObject = mResourceManager->getProgram(program);
bool loaded = programObject->setProgramBinary(binary, length);
bool loaded = programObject->setProgramBinary(binaryFormat, binary, length);
// if the current program was reloaded successfully we
// need to install the new executables
......@@ -928,8 +912,6 @@ void Context::getIntegerv(GLenum pname, GLint *params)
case GL_MAX_RENDERBUFFER_SIZE: *params = mCaps.maxRenderbufferSize; break;
case GL_MAX_COLOR_ATTACHMENTS_EXT: *params = mCaps.maxColorAttachments; break;
case GL_MAX_DRAW_BUFFERS_EXT: *params = mCaps.maxDrawBuffers; break;
case GL_NUM_SHADER_BINARY_FORMATS: *params = 0; break;
case GL_SHADER_BINARY_FORMATS: /* no shader binary formats are supported */ break;
//case GL_FRAMEBUFFER_BINDING: // now equivalent to GL_DRAW_FRAMEBUFFER_BINDING_ANGLE
case GL_SUBPIXEL_BITS: *params = 4; break;
case GL_MAX_TEXTURE_SIZE: *params = mCaps.max2DTextureSize; break;
......@@ -943,14 +925,12 @@ void Context::getIntegerv(GLenum pname, GLint *params)
case GL_MAX_COMBINED_UNIFORM_BLOCKS: *params = getMaximumCombinedUniformBufferBindings(); break;
case GL_MAJOR_VERSION: *params = mClientVersion; break;
case GL_MINOR_VERSION: *params = 0; break;
case GL_MAX_ELEMENTS_INDICES: *params = mRenderer->getMaxRecommendedElementsIndices(); break;
case GL_MAX_ELEMENTS_VERTICES: *params = mRenderer->getMaxRecommendedElementsVertices(); break;
case GL_MAX_ELEMENTS_INDICES: *params = mCaps.maxElementsIndices; break;
case GL_MAX_ELEMENTS_VERTICES: *params = mCaps.maxElementsVertices; break;
case GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS: *params = mRenderer->getMaxTransformFeedbackInterleavedComponents(); break;
case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS: *params = mRenderer->getMaxTransformFeedbackBuffers(); break;
case GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS: *params = mRenderer->getMaxTransformFeedbackSeparateComponents(); break;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
params[0] = mNumCompressedTextureFormats;
break;
case GL_NUM_COMPRESSED_TEXTURE_FORMATS: *params = mCaps.compressedTextureFormats.size(); break;
case GL_MAX_SAMPLES_ANGLE: *params = mExtensions.maxSamples; break;
case GL_IMPLEMENTATION_COLOR_READ_TYPE:
case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
......@@ -970,30 +950,22 @@ void Context::getIntegerv(GLenum pname, GLint *params)
}
break;
case GL_COMPRESSED_TEXTURE_FORMATS:
{
if (mExtensions.textureCompressionDXT1)
{
*params++ = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
*params++ = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
}
if (mExtensions.textureCompressionDXT3)
{
*params++ = GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
}
if (mExtensions.textureCompressionDXT5)
{
*params++ = GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
}
}
std::copy(mCaps.compressedTextureFormats.begin(), mCaps.compressedTextureFormats.end(), params);
break;
case GL_RESET_NOTIFICATION_STRATEGY_EXT:
*params = mResetStrategy;
break;
case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
*params = 1;
case GL_NUM_SHADER_BINARY_FORMATS:
*params = mCaps.shaderBinaryFormats.size();
break;
case GL_PROGRAM_BINARY_FORMATS_OES:
*params = GL_PROGRAM_BINARY_ANGLE;
case GL_SHADER_BINARY_FORMATS:
std::copy(mCaps.shaderBinaryFormats.begin(), mCaps.shaderBinaryFormats.end(), params);
break;
case GL_NUM_PROGRAM_BINARY_FORMATS:
*params = mCaps.programBinaryFormats.size();
break;
case GL_PROGRAM_BINARY_FORMATS:
std::copy(mCaps.programBinaryFormats.begin(), mCaps.programBinaryFormats.end(), params);
break;
case GL_NUM_EXTENSIONS:
*params = static_cast<GLint>(mExtensionStrings.size());
......@@ -1031,8 +1003,7 @@ void Context::getInteger64v(GLenum pname, GLint64 *params)
}
break;
case GL_MAX_SERVER_WAIT_TIMEOUT:
// We do not wait for server fence objects internally, so report a max timeout of zero.
*params = 0;
*params = mCaps.maxServerWaitTimeout;
break;
default:
UNREACHABLE();
......@@ -1079,13 +1050,19 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu
case GL_COMPRESSED_TEXTURE_FORMATS:
{
*type = GL_INT;
*numParams = mNumCompressedTextureFormats;
*numParams = mCaps.compressedTextureFormats.size();
}
return true;
case GL_PROGRAM_BINARY_FORMATS_OES:
{
*type = GL_INT;
*numParams = mCaps.programBinaryFormats.size();
}
return true;
case GL_SHADER_BINARY_FORMATS:
{
*type = GL_INT;
*numParams = 0;
*numParams = mCaps.shaderBinaryFormats.size();
}
return true;
case GL_MAX_VERTEX_ATTRIBS:
......@@ -1154,7 +1131,6 @@ bool Context::getQueryParameterInfo(GLenum pname, GLenum *type, unsigned int *nu
case GL_TEXTURE_BINDING_CUBE_MAP:
case GL_RESET_NOTIFICATION_STRATEGY_EXT:
case GL_NUM_PROGRAM_BINARY_FORMATS_OES:
case GL_PROGRAM_BINARY_FORMATS_OES:
{
*type = GL_INT;
*numParams = 1;
......@@ -2425,6 +2401,8 @@ void Context::initCaps(GLuint clientVersion)
}
GLuint maxSamples = 0;
mCaps.compressedTextureFormats.clear();
const TextureCapsMap &rendererFormats = mRenderer->getRendererTextureCaps();
for (TextureCapsMap::const_iterator i = rendererFormats.begin(); i != rendererFormats.end(); i++)
{
......@@ -2445,6 +2423,11 @@ void Context::initCaps(GLuint clientVersion)
}
maxSamples = std::max(maxSamples, formatCaps.getMaxSamples());
if (formatInfo.compressed)
{
mCaps.compressedTextureFormats.push_back(format);
}
mTextureCaps.insert(format, formatCaps);
}
}
......
......@@ -135,7 +135,7 @@ class Context
void bindPixelUnpackBuffer(GLuint buffer);
void useProgram(GLuint program);
void linkProgram(GLuint program);
void setProgramBinary(GLuint program, const void *binary, GLint length);
void setProgramBinary(GLuint program, GLenum binaryFormat, const void *binary, GLint length);
void bindTransformFeedback(GLuint transformFeedback);
void beginQuery(GLenum target, GLuint query);
......@@ -324,7 +324,6 @@ class Context
bool mRobustAccess;
bool mSupportsVertexTexture;
int mNumCompressedTextureFormats;
ResourceManager *mResourceManager;
};
......
......@@ -303,14 +303,14 @@ ProgramBinary* Program::getProgramBinary() const
return mProgramBinary.get();
}
bool Program::setProgramBinary(const void *binary, GLsizei length)
bool Program::setProgramBinary(GLenum binaryFormat, const void *binary, GLsizei length)
{
unlink(false);
mInfoLog.reset();
mProgramBinary.set(new ProgramBinary(mRenderer));
mLinked = mProgramBinary->load(mInfoLog, binary, length);
mLinked = mProgramBinary->load(mInfoLog, binaryFormat, binary, length);
if (!mLinked)
{
mProgramBinary.set(NULL);
......
......@@ -77,7 +77,7 @@ class Program
bool link();
bool isLinked();
bool setProgramBinary(const void *binary, GLsizei length);
bool setProgramBinary(GLenum binaryFormat, const void *binary, GLsizei length);
ProgramBinary *getProgramBinary() const;
int getInfoLogLength() const;
......
......@@ -1099,11 +1099,13 @@ bool ProgramBinary::linkVaryings(InfoLog &infoLog, FragmentShader *fragmentShade
return true;
}
bool ProgramBinary::load(InfoLog &infoLog, const void *binary, GLsizei length)
bool ProgramBinary::load(InfoLog &infoLog, GLenum binaryFormat, const void *binary, GLsizei length)
{
#ifdef ANGLE_DISABLE_PROGRAM_BINARY_LOAD
return false;
#else
ASSERT(binaryFormat == GL_PROGRAM_BINARY_ANGLE);
reset();
BinaryInputStream stream(binary, length);
......@@ -1376,8 +1378,13 @@ bool ProgramBinary::load(InfoLog &infoLog, const void *binary, GLsizei length)
#endif // #ifdef ANGLE_DISABLE_PROGRAM_BINARY_LOAD
}
bool ProgramBinary::save(void* binary, GLsizei bufSize, GLsizei *length)
bool ProgramBinary::save(GLenum *binaryFormat, void *binary, GLsizei bufSize, GLsizei *length)
{
if (binaryFormat)
{
*binaryFormat = GL_PROGRAM_BINARY_ANGLE;
}
BinaryOutputStream stream;
stream.writeInt(GL_PROGRAM_BINARY_ANGLE);
......@@ -1583,7 +1590,7 @@ bool ProgramBinary::save(void* binary, GLsizei bufSize, GLsizei *length)
GLint ProgramBinary::getLength()
{
GLint length;
if (save(NULL, INT_MAX, &length))
if (save(NULL, NULL, INT_MAX, &length))
{
return length;
}
......
......@@ -133,8 +133,8 @@ class ProgramBinary : public RefCountObject
void applyUniforms();
bool applyUniformBuffers(const std::vector<Buffer*> boundBuffers);
bool load(InfoLog &infoLog, const void *binary, GLsizei length);
bool save(void* binary, GLsizei bufSize, GLsizei *length);
bool load(InfoLog &infoLog, GLenum binaryFormat, const void *binary, GLsizei length);
bool save(GLenum *binaryFormat, void *binary, GLsizei bufSize, GLsizei *length);
GLint getLength();
bool link(InfoLog &infoLog, const AttributeBindings &attributeBindings, FragmentShader *fragmentShader, VertexShader *vertexShader,
......
......@@ -3720,8 +3720,18 @@ void __stdcall glShaderBinary(GLsizei n, const GLuint* shaders, GLenum binaryfor
"const GLvoid* binary = 0x%0.8p, GLsizei length = %d)",
n, shaders, binaryformat, binary, length);
// No binary shader formats are supported.
return gl::error(GL_INVALID_ENUM);
gl::Context* context = gl::getNonLostContext();
if (context)
{
const std::vector<GLenum> &shaderBinaryFormats = context->getCaps().shaderBinaryFormats;
if (std::find(shaderBinaryFormats.begin(), shaderBinaryFormats.end(), binaryformat) == shaderBinaryFormats.end())
{
return gl::error(GL_INVALID_ENUM);
}
// No binary shader formats are supported.
UNIMPLEMENTED();
}
}
void __stdcall glShaderSource(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length)
......@@ -7982,12 +7992,10 @@ void __stdcall glGetProgramBinaryOES(GLuint program, GLsizei bufSize, GLsizei *l
return gl::error(GL_INVALID_OPERATION);
}
if (!programBinary->save(binary, bufSize, length))
if (!programBinary->save(binaryFormat, binary, bufSize, length))
{
return gl::error(GL_INVALID_OPERATION);
}
*binaryFormat = GL_PROGRAM_BINARY_ANGLE;
}
}
......@@ -8001,19 +8009,19 @@ void __stdcall glProgramBinaryOES(GLuint program, GLenum binaryFormat,
if (context)
{
if (binaryFormat != GL_PROGRAM_BINARY_ANGLE)
const std::vector<GLenum> &programBinaryFormats = context->getCaps().programBinaryFormats;
if (std::find(programBinaryFormats.begin(), programBinaryFormats.end(), binaryFormat) == programBinaryFormats.end())
{
return gl::error(GL_INVALID_ENUM);
}
gl::Program *programObject = context->getProgram(program);
if (!programObject)
{
return gl::error(GL_INVALID_OPERATION);
}
context->setProgramBinary(program, binary, length);
context->setProgramBinary(program, binaryFormat, binary, length);
}
}
......
......@@ -171,8 +171,6 @@ class Renderer
virtual unsigned int getMaxUniformBufferSize() const = 0;
virtual bool getShareHandleSupport() const = 0;
virtual bool getPostSubBufferSupport() const = 0;
virtual int getMaxRecommendedElementsIndices() const = 0;
virtual int getMaxRecommendedElementsVertices() const = 0;
virtual int getMajorShaderModel() const = 0;
virtual int getMinSwapInterval() const = 0;
......
......@@ -1965,24 +1965,6 @@ bool Renderer11::getPostSubBufferSupport() const
return false;
}
int Renderer11::getMaxRecommendedElementsIndices() const
{
META_ASSERT(D3D11_REQ_DRAWINDEXED_INDEX_COUNT_2_TO_EXP == 32);
META_ASSERT(D3D10_REQ_DRAWINDEXED_INDEX_COUNT_2_TO_EXP == 32);
// D3D11 allows up to 2^32 elements, but we report max signed int for convenience.
return std::numeric_limits<GLint>::max();
}
int Renderer11::getMaxRecommendedElementsVertices() const
{
META_ASSERT(D3D11_REQ_DRAW_VERTEX_COUNT_2_TO_EXP == 32);
META_ASSERT(D3D10_REQ_DRAW_VERTEX_COUNT_2_TO_EXP == 32);
// D3D11 allows up to 2^32 elements, but we report max signed int for convenience.
return std::numeric_limits<GLint>::max();
}
int Renderer11::getMajorShaderModel() const
{
switch (mFeatureLevel)
......
......@@ -121,8 +121,6 @@ class Renderer11 : public Renderer
virtual unsigned int getMaxUniformBufferSize() const;
virtual bool getShareHandleSupport() const;
virtual bool getPostSubBufferSupport() const;
virtual int getMaxRecommendedElementsIndices() const;
virtual int getMaxRecommendedElementsVertices() const;
virtual int getMajorShaderModel() const;
virtual int getMinSwapInterval() const;
......
......@@ -493,6 +493,50 @@ static size_t GetMaximumViewportSize(D3D_FEATURE_LEVEL featureLevel)
}
}
static size_t GetMaximumDrawIndexedIndexCount(D3D_FEATURE_LEVEL featureLevel)
{
// D3D11 allows up to 2^32 elements, but we report max signed int for convenience since that's what's
// returned from glGetInteger
META_ASSERT(D3D11_REQ_DRAWINDEXED_INDEX_COUNT_2_TO_EXP == 32);
META_ASSERT(D3D10_REQ_DRAWINDEXED_INDEX_COUNT_2_TO_EXP == 32);
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0:
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0: return std::numeric_limits<GLint>::max();
case D3D_FEATURE_LEVEL_9_3:
case D3D_FEATURE_LEVEL_9_2: return D3D_FL9_2_IA_PRIMITIVE_MAX_COUNT;
case D3D_FEATURE_LEVEL_9_1: return D3D_FL9_1_IA_PRIMITIVE_MAX_COUNT;
default: UNREACHABLE(); return 0;
}
}
static size_t GetMaximumDrawVertexCount(D3D_FEATURE_LEVEL featureLevel)
{
// D3D11 allows up to 2^32 elements, but we report max signed int for convenience since that's what's
// returned from glGetInteger
META_ASSERT(D3D11_REQ_DRAW_VERTEX_COUNT_2_TO_EXP == 32);
META_ASSERT(D3D10_REQ_DRAW_VERTEX_COUNT_2_TO_EXP == 32);
switch (featureLevel)
{
case D3D_FEATURE_LEVEL_11_1:
case D3D_FEATURE_LEVEL_11_0:
case D3D_FEATURE_LEVEL_10_1:
case D3D_FEATURE_LEVEL_10_0: return std::numeric_limits<GLint>::max();
case D3D_FEATURE_LEVEL_9_3:
case D3D_FEATURE_LEVEL_9_2: return D3D_FL9_2_IA_PRIMITIVE_MAX_COUNT;
case D3D_FEATURE_LEVEL_9_1: return D3D_FL9_1_IA_PRIMITIVE_MAX_COUNT;
default: UNREACHABLE(); return 0;
}
}
void GenerateCaps(ID3D11Device *device, gl::Caps *caps, gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions)
{
GLuint maxSamples = 0;
......@@ -503,6 +547,11 @@ void GenerateCaps(ID3D11Device *device, gl::Caps *caps, gl::TextureCapsMap *text
textureCapsMap->insert(*internalFormat, textureCaps);
maxSamples = std::max(maxSamples, textureCaps.getMaxSamples());
if (gl::GetInternalFormatInfo(*internalFormat).compressed)
{
caps->compressedTextureFormats.push_back(*internalFormat);
}
}
D3D_FEATURE_LEVEL featureLevel = device->GetFeatureLevel();
......@@ -537,6 +586,16 @@ void GenerateCaps(ID3D11Device *device, gl::Caps *caps, gl::TextureCapsMap *text
caps->minAliasedLineWidth = 1.0f;
caps->maxAliasedLineWidth = 1.0f;
// Primitive count limits
caps->maxElementsIndices = GetMaximumDrawIndexedIndexCount(featureLevel);
caps->maxElementsVertices = GetMaximumDrawVertexCount(featureLevel);
// Program and shader binary formats (no supported shader binary formats)
caps->programBinaryFormats.push_back(GL_PROGRAM_BINARY_ANGLE);
// We do not wait for server fence objects internally, so report a max timeout of zero.
caps->maxServerWaitTimeout = 0;
// GL extension support
extensions->setTextureExtensionSupport(*textureCapsMap);
extensions->elementIndexUint = true;
......
......@@ -2269,20 +2269,6 @@ bool Renderer9::getPostSubBufferSupport() const
return true;
}
int Renderer9::getMaxRecommendedElementsIndices() const
{
// ES3 only
UNREACHABLE();
return 0;
}
int Renderer9::getMaxRecommendedElementsVertices() const
{
// ES3 only
UNREACHABLE();
return 0;
}
int Renderer9::getMajorShaderModel() const
{
return D3DSHADER_VERSION_MAJOR(mDeviceCaps.PixelShaderVersion);
......
......@@ -122,8 +122,6 @@ class Renderer9 : public Renderer
virtual unsigned int getMaxUniformBufferSize() const;
virtual bool getShareHandleSupport() const;
virtual bool getPostSubBufferSupport() const;
virtual int getMaxRecommendedElementsIndices() const;
virtual int getMaxRecommendedElementsVertices() const;
virtual int getMajorShaderModel() const;
DWORD getCapsDeclTypes() const;
......
......@@ -328,6 +328,11 @@ void GenerateCaps(IDirect3D9 *d3d9, IDirect3DDevice9 *device, D3DDEVTYPE deviceT
textureCapsMap->insert(*internalFormat, textureCaps);
maxSamples = std::max(maxSamples, textureCaps.getMaxSamples());
if (gl::GetInternalFormatInfo(*internalFormat).compressed)
{
caps->compressedTextureFormats.push_back(*internalFormat);
}
}
// GL core feature limits
......@@ -367,6 +372,16 @@ void GenerateCaps(IDirect3D9 *d3d9, IDirect3DDevice9 *device, D3DDEVTYPE deviceT
caps->minAliasedLineWidth = 1.0f;
caps->maxAliasedLineWidth = 1.0f;
// Primitive count limits (unused in ES2)
caps->maxElementsIndices = 0;
caps->maxElementsVertices = 0;
// Program and shader binary formats (no supported shader binary formats)
caps->programBinaryFormats.push_back(GL_PROGRAM_BINARY_ANGLE);
// WaitSync is ES3-only, set to zero
caps->maxServerWaitTimeout = 0;
// GL extension support
extensions->setTextureExtensionSupport(*textureCapsMap);
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