Commit 61afff14 by Yunchao He Committed by Commit Bot

ES31: Add PROGRAM_SEPARABLE to ProgramParameter and GetProgram

BUG=angleproject:1939 TEST=angle_end2end_tests Change-Id: I97ad11360f7c015947a2c0cc7d4a47f994726834 Reviewed-on: https://chromium-review.googlesource.com/454264 Commit-Queue: Corentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org>
parent 48fed633
...@@ -2340,10 +2340,7 @@ void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *param ...@@ -2340,10 +2340,7 @@ void Context::getSamplerParameterfv(GLuint sampler, GLenum pname, GLfloat *param
void Context::programParameteri(GLuint program, GLenum pname, GLint value) void Context::programParameteri(GLuint program, GLenum pname, GLint value)
{ {
gl::Program *programObject = getProgram(program); gl::Program *programObject = getProgram(program);
ASSERT(programObject != nullptr); SetProgramParameteri(programObject, pname, value);
ASSERT(pname == GL_PROGRAM_BINARY_RETRIEVABLE_HINT);
programObject->setBinaryRetrievableHint(value != GL_FALSE);
} }
void Context::initRendererString() void Context::initRendererString()
......
...@@ -1095,6 +1095,21 @@ bool Program::getBinaryRetrievableHint() const ...@@ -1095,6 +1095,21 @@ bool Program::getBinaryRetrievableHint() const
return mState.mBinaryRetrieveableHint; return mState.mBinaryRetrieveableHint;
} }
void Program::setSeparable(bool separable)
{
// TODO(yunchao) : replace with dirty bits
if (mState.mSeparable != separable)
{
mProgram->setSeparable(separable);
mState.mSeparable = separable;
}
}
bool Program::isSeparable() const
{
return mState.mSeparable;
}
void Program::release(const Context *context) void Program::release(const Context *context)
{ {
mRefCount--; mRefCount--;
......
...@@ -257,6 +257,7 @@ class ProgramState final : angle::NonCopyable ...@@ -257,6 +257,7 @@ class ProgramState final : angle::NonCopyable
std::map<int, VariableLocation> mOutputLocations; std::map<int, VariableLocation> mOutputLocations;
bool mBinaryRetrieveableHint; bool mBinaryRetrieveableHint;
bool mSeparable;
}; };
class Program final : angle::NonCopyable, public LabeledObject class Program final : angle::NonCopyable, public LabeledObject
...@@ -308,6 +309,9 @@ class Program final : angle::NonCopyable, public LabeledObject ...@@ -308,6 +309,9 @@ class Program final : angle::NonCopyable, public LabeledObject
void setBinaryRetrievableHint(bool retrievable); void setBinaryRetrievableHint(bool retrievable);
bool getBinaryRetrievableHint() const; bool getBinaryRetrievableHint() const;
void setSeparable(bool separable);
bool isSeparable() const;
int getInfoLogLength() const; int getInfoLogLength() const;
void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const; void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const;
void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders) const; void getAttachedShaders(GLsizei maxCount, GLsizei *count, GLuint *shaders) const;
......
...@@ -605,6 +605,9 @@ void QueryProgramiv(const Program *program, GLenum pname, GLint *params) ...@@ -605,6 +605,9 @@ void QueryProgramiv(const Program *program, GLenum pname, GLint *params)
case GL_PROGRAM_BINARY_RETRIEVABLE_HINT: case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
*params = program->getBinaryRetrievableHint(); *params = program->getBinaryRetrievableHint();
break; break;
case GL_PROGRAM_SEPARABLE:
*params = program->isSeparable();
break;
default: default:
UNREACHABLE(); UNREACHABLE();
break; break;
...@@ -939,6 +942,24 @@ void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint para ...@@ -939,6 +942,24 @@ void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint para
} }
} }
void SetProgramParameteri(Program *program, GLenum pname, GLint value)
{
ASSERT(program);
switch (pname)
{
case GL_PROGRAM_BINARY_RETRIEVABLE_HINT:
program->setBinaryRetrievableHint(value != GL_FALSE);
break;
case GL_PROGRAM_SEPARABLE:
program->setSeparable(value != GL_FALSE);
break;
default:
UNREACHABLE();
break;
}
}
GLuint QueryProgramResourceIndex(const Program *program, GLuint QueryProgramResourceIndex(const Program *program,
GLenum programInterface, GLenum programInterface,
const GLchar *name) const GLchar *name)
......
...@@ -107,6 +107,8 @@ void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params); ...@@ -107,6 +107,8 @@ void SetSamplerParameteriv(Sampler *sampler, GLenum pname, const GLint *params);
void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param); void SetFramebufferParameteri(Framebuffer *framebuffer, GLenum pname, GLint param);
void SetProgramParameteri(Program *program, GLenum pname, GLint value);
GLuint QueryProgramResourceIndex(const Program *program, GLuint QueryProgramResourceIndex(const Program *program,
GLenum programInterface, GLenum programInterface,
const GLchar *name); const GLchar *name);
......
...@@ -45,6 +45,7 @@ class ProgramImpl : angle::NonCopyable ...@@ -45,6 +45,7 @@ class ProgramImpl : angle::NonCopyable
gl::BinaryInputStream *stream) = 0; gl::BinaryInputStream *stream) = 0;
virtual gl::Error save(gl::BinaryOutputStream *stream) = 0; virtual gl::Error save(gl::BinaryOutputStream *stream) = 0;
virtual void setBinaryRetrievableHint(bool retrievable) = 0; virtual void setBinaryRetrievableHint(bool retrievable) = 0;
virtual void setSeparable(bool separable) = 0;
virtual LinkResult link(ContextImpl *contextImpl, virtual LinkResult link(ContextImpl *contextImpl,
const gl::VaryingPacking &packing, const gl::VaryingPacking &packing,
......
...@@ -26,6 +26,7 @@ class MockProgramImpl : public rx::ProgramImpl ...@@ -26,6 +26,7 @@ class MockProgramImpl : public rx::ProgramImpl
MOCK_METHOD3(load, LinkResult(const ContextImpl *, gl::InfoLog &, gl::BinaryInputStream *)); MOCK_METHOD3(load, LinkResult(const ContextImpl *, gl::InfoLog &, gl::BinaryInputStream *));
MOCK_METHOD1(save, gl::Error(gl::BinaryOutputStream *)); MOCK_METHOD1(save, gl::Error(gl::BinaryOutputStream *));
MOCK_METHOD1(setBinaryRetrievableHint, void(bool)); MOCK_METHOD1(setBinaryRetrievableHint, void(bool));
MOCK_METHOD1(setSeparable, void(bool));
MOCK_METHOD3(link, LinkResult(ContextImpl *, const gl::VaryingPacking &, gl::InfoLog &)); MOCK_METHOD3(link, LinkResult(ContextImpl *, const gl::VaryingPacking &, gl::InfoLog &));
MOCK_METHOD2(validate, GLboolean(const gl::Caps &, gl::InfoLog *)); MOCK_METHOD2(validate, GLboolean(const gl::Caps &, gl::InfoLog *));
......
...@@ -1128,6 +1128,10 @@ void ProgramD3D::setBinaryRetrievableHint(bool /* retrievable */) ...@@ -1128,6 +1128,10 @@ void ProgramD3D::setBinaryRetrievableHint(bool /* retrievable */)
{ {
} }
void ProgramD3D::setSeparable(bool /* separable */)
{
}
gl::Error ProgramD3D::getPixelExecutableForFramebuffer(const gl::Framebuffer *fbo, gl::Error ProgramD3D::getPixelExecutableForFramebuffer(const gl::Framebuffer *fbo,
ShaderExecutableD3D **outExecutable) ShaderExecutableD3D **outExecutable)
{ {
......
...@@ -163,6 +163,7 @@ class ProgramD3D : public ProgramImpl ...@@ -163,6 +163,7 @@ class ProgramD3D : public ProgramImpl
gl::BinaryInputStream *stream) override; gl::BinaryInputStream *stream) override;
gl::Error save(gl::BinaryOutputStream *stream) override; gl::Error save(gl::BinaryOutputStream *stream) override;
void setBinaryRetrievableHint(bool retrievable) override; void setBinaryRetrievableHint(bool retrievable) override;
void setSeparable(bool separable) override;
gl::Error getPixelExecutableForFramebuffer(const gl::Framebuffer *fbo, gl::Error getPixelExecutableForFramebuffer(const gl::Framebuffer *fbo,
ShaderExecutableD3D **outExectuable); ShaderExecutableD3D **outExectuable);
......
...@@ -111,6 +111,11 @@ void ProgramGL::setBinaryRetrievableHint(bool retrievable) ...@@ -111,6 +111,11 @@ void ProgramGL::setBinaryRetrievableHint(bool retrievable)
} }
} }
void ProgramGL::setSeparable(bool separable)
{
mFunctions->programParameteri(mProgramID, GL_PROGRAM_SEPARABLE, separable ? GL_TRUE : GL_FALSE);
}
LinkResult ProgramGL::link(ContextImpl *contextImpl, LinkResult ProgramGL::link(ContextImpl *contextImpl,
const gl::VaryingPacking &packing, const gl::VaryingPacking &packing,
gl::InfoLog &infoLog) gl::InfoLog &infoLog)
......
...@@ -36,6 +36,7 @@ class ProgramGL : public ProgramImpl ...@@ -36,6 +36,7 @@ class ProgramGL : public ProgramImpl
gl::BinaryInputStream *stream) override; gl::BinaryInputStream *stream) override;
gl::Error save(gl::BinaryOutputStream *stream) override; gl::Error save(gl::BinaryOutputStream *stream) override;
void setBinaryRetrievableHint(bool retrievable) override; void setBinaryRetrievableHint(bool retrievable) override;
void setSeparable(bool separable) override;
LinkResult link(ContextImpl *contextImpl, LinkResult link(ContextImpl *contextImpl,
const gl::VaryingPacking &packing, const gl::VaryingPacking &packing,
......
...@@ -38,6 +38,10 @@ void ProgramNULL::setBinaryRetrievableHint(bool retrievable) ...@@ -38,6 +38,10 @@ void ProgramNULL::setBinaryRetrievableHint(bool retrievable)
{ {
} }
void ProgramNULL::setSeparable(bool separable)
{
}
LinkResult ProgramNULL::link(ContextImpl *contextImpl, LinkResult ProgramNULL::link(ContextImpl *contextImpl,
const gl::VaryingPacking &packing, const gl::VaryingPacking &packing,
gl::InfoLog &infoLog) gl::InfoLog &infoLog)
......
...@@ -26,6 +26,7 @@ class ProgramNULL : public ProgramImpl ...@@ -26,6 +26,7 @@ class ProgramNULL : public ProgramImpl
gl::BinaryInputStream *stream) override; gl::BinaryInputStream *stream) override;
gl::Error save(gl::BinaryOutputStream *stream) override; gl::Error save(gl::BinaryOutputStream *stream) override;
void setBinaryRetrievableHint(bool retrievable) override; void setBinaryRetrievableHint(bool retrievable) override;
void setSeparable(bool separable) override;
LinkResult link(ContextImpl *contextImpl, LinkResult link(ContextImpl *contextImpl,
const gl::VaryingPacking &packing, const gl::VaryingPacking &packing,
......
...@@ -53,6 +53,11 @@ void ProgramVk::setBinaryRetrievableHint(bool retrievable) ...@@ -53,6 +53,11 @@ void ProgramVk::setBinaryRetrievableHint(bool retrievable)
UNIMPLEMENTED(); UNIMPLEMENTED();
} }
void ProgramVk::setSeparable(bool separable)
{
UNIMPLEMENTED();
}
LinkResult ProgramVk::link(ContextImpl *contextImpl, LinkResult ProgramVk::link(ContextImpl *contextImpl,
const gl::VaryingPacking &packing, const gl::VaryingPacking &packing,
gl::InfoLog &infoLog) gl::InfoLog &infoLog)
......
...@@ -28,6 +28,7 @@ class ProgramVk : public ProgramImpl ...@@ -28,6 +28,7 @@ class ProgramVk : public ProgramImpl
gl::BinaryInputStream *stream) override; gl::BinaryInputStream *stream) override;
gl::Error save(gl::BinaryOutputStream *stream) override; gl::Error save(gl::BinaryOutputStream *stream) override;
void setBinaryRetrievableHint(bool retrievable) override; void setBinaryRetrievableHint(bool retrievable) override;
void setSeparable(bool separable) override;
LinkResult link(ContextImpl *contextImpl, LinkResult link(ContextImpl *contextImpl,
const gl::VaryingPacking &packing, const gl::VaryingPacking &packing,
......
...@@ -5191,6 +5191,14 @@ bool ValidateGetProgramiv(Context *context, GLuint program, GLenum pname, GLsize ...@@ -5191,6 +5191,14 @@ bool ValidateGetProgramiv(Context *context, GLuint program, GLenum pname, GLsize
} }
break; break;
case GL_PROGRAM_SEPARABLE:
if (context->getClientVersion() < Version(3, 1))
{
context->handleError(Error(GL_INVALID_ENUM, "Querying requires at least ES 3.1."));
return false;
}
break;
default: default:
context->handleError(Error(GL_INVALID_ENUM, "Unknown parameter name.")); context->handleError(Error(GL_INVALID_ENUM, "Unknown parameter name."));
return false; return false;
......
...@@ -1309,8 +1309,8 @@ static bool ValidateBindBufferCommon(Context *context, ...@@ -1309,8 +1309,8 @@ static bool ValidateBindBufferCommon(Context *context,
{ {
if (context->getClientVersion() < ES_3_1) if (context->getClientVersion() < ES_3_1)
{ {
context->handleError( context->handleError(Error(
Error(GL_INVALID_ENUM, "ATOMIC_COUNTER_BUFFER is not supported in GLES3.")); GL_INVALID_ENUM, "ATOMIC_COUNTER_BUFFER is not supported before GLES 3.1"));
return false; return false;
} }
if (index >= caps.maxAtomicCounterBufferBindings) if (index >= caps.maxAtomicCounterBufferBindings)
...@@ -1331,8 +1331,8 @@ static bool ValidateBindBufferCommon(Context *context, ...@@ -1331,8 +1331,8 @@ static bool ValidateBindBufferCommon(Context *context,
{ {
if (context->getClientVersion() < ES_3_1) if (context->getClientVersion() < ES_3_1)
{ {
context->handleError( context->handleError(Error(
Error(GL_INVALID_ENUM, "ATOMIC_COUNTER_BUFFER is not supported in GLES3.")); GL_INVALID_ENUM, "ATOMIC_COUNTER_BUFFER is not supported before GLES 3.1"));
return false; return false;
} }
break; break;
...@@ -1421,6 +1421,22 @@ bool ValidateProgramParameteri(Context *context, GLuint program, GLenum pname, G ...@@ -1421,6 +1421,22 @@ bool ValidateProgramParameteri(Context *context, GLuint program, GLenum pname, G
} }
break; break;
case GL_PROGRAM_SEPARABLE:
if (context->getClientVersion() < ES_3_1)
{
context->handleError(
Error(GL_INVALID_ENUM, "PROGRAM_SEPARABLE is not supported before GLES 3.1"));
return false;
}
if (value != GL_FALSE && value != GL_TRUE)
{
context->handleError(Error(
GL_INVALID_VALUE, "Invalid value, expected GL_FALSE or GL_TRUE: %i", value));
return false;
}
break;
default: default:
context->handleError(Error(GL_INVALID_ENUM, "Invalid pname: 0x%X", pname)); context->handleError(Error(GL_INVALID_ENUM, "Invalid pname: 0x%X", pname));
return false; return false;
......
...@@ -65,6 +65,7 @@ ...@@ -65,6 +65,7 @@
'<(angle_path)/src/tests/gl_tests/OcclusionQueriesTest.cpp', '<(angle_path)/src/tests/gl_tests/OcclusionQueriesTest.cpp',
'<(angle_path)/src/tests/gl_tests/ProgramBinaryTest.cpp', '<(angle_path)/src/tests/gl_tests/ProgramBinaryTest.cpp',
'<(angle_path)/src/tests/gl_tests/ProgramInterfaceTest.cpp', '<(angle_path)/src/tests/gl_tests/ProgramInterfaceTest.cpp',
'<(angle_path)/src/tests/gl_tests/ProgramParameterTest.cpp',
'<(angle_path)/src/tests/gl_tests/ReadPixelsTest.cpp', '<(angle_path)/src/tests/gl_tests/ReadPixelsTest.cpp',
'<(angle_path)/src/tests/gl_tests/RendererTest.cpp', '<(angle_path)/src/tests/gl_tests/RendererTest.cpp',
'<(angle_path)/src/tests/gl_tests/RobustClientMemoryTest.cpp', '<(angle_path)/src/tests/gl_tests/RobustClientMemoryTest.cpp',
......
//
// Copyright 2017 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ProgramParameterTest: validate parameters of ProgramParameter
#include "test_utils/ANGLETest.h"
using namespace angle;
namespace
{
class ProgramParameterTest : public ANGLETest
{
protected:
ProgramParameterTest()
{
setWindowWidth(64);
setWindowHeight(64);
setConfigRedBits(8);
setConfigGreenBits(8);
setConfigBlueBits(8);
setConfigAlphaBits(8);
}
};
class ProgramParameterTestES31 : public ProgramParameterTest
{
protected:
ProgramParameterTestES31() : ProgramParameterTest() {}
};
// If es version < 3.1, PROGRAM_SEPARABLE is not supported.
TEST_P(ProgramParameterTest, ValidatePname)
{
GLuint program = glCreateProgram();
ASSERT_NE(program, 0u);
glProgramParameteri(program, GL_PROGRAM_BINARY_RETRIEVABLE_HINT, GL_TRUE);
ASSERT_GL_NO_ERROR();
glProgramParameteri(program, GL_PROGRAM_SEPARABLE, GL_TRUE);
if (getClientMajorVersion() < 3 || getClientMinorVersion() < 1)
{
ASSERT_GL_ERROR(GL_INVALID_ENUM);
}
else
{
ASSERT_GL_NO_ERROR();
}
glDeleteProgram(program);
}
// Validate parameters for ProgramParameter when pname is PROGRAM_SEPARABLE.
TEST_P(ProgramParameterTestES31, ValidateParameters)
{
GLuint program = glCreateProgram();
ASSERT_NE(program, 0u);
glProgramParameteri(0, GL_PROGRAM_SEPARABLE, GL_TRUE);
ASSERT_GL_ERROR(GL_INVALID_VALUE);
glProgramParameteri(program, GL_PROGRAM_SEPARABLE, 2);
ASSERT_GL_ERROR(GL_INVALID_VALUE);
glDeleteProgram(program);
}
ANGLE_INSTANTIATE_TEST(ProgramParameterTest,
ES3_OPENGL(),
ES3_OPENGLES(),
ES3_D3D11(),
ES31_OPENGL(),
ES31_OPENGLES(),
ES31_D3D11());
ANGLE_INSTANTIATE_TEST(ProgramParameterTestES31, ES31_OPENGL(), ES31_OPENGLES(), ES31_D3D11());
}
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