diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-12 17:23:58 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-12 17:23:58 +0000 |
commit | b273e43cebe9f829f9e871bc27ddf5cea4feef28 (patch) | |
tree | 2db79f311c3f080d44dc1f99fc5548b4beaf6112 /gpu/command_buffer/service | |
parent | d382b18cd1dafdadc6e55843e48cb78f0f99a1b9 (diff) | |
download | chromium_src-b273e43cebe9f829f9e871bc27ddf5cea4feef28.zip chromium_src-b273e43cebe9f829f9e871bc27ddf5cea4feef28.tar.gz chromium_src-b273e43cebe9f829f9e871bc27ddf5cea4feef28.tar.bz2 |
Adds stubs for glShaderBinary and glReleaseShaderCompiler.
Also handles certain GLES2 enums passed to glGetXXX that
have no corresponding OpenGL enums
TEST=none
BUG=none
Review URL: http://codereview.chromium.org/1609016
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@44254 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer/service')
7 files changed, 171 insertions, 5 deletions
diff --git a/gpu/command_buffer/service/gl_interface.h b/gpu/command_buffer/service/gl_interface.h index 139dff2..0629e20 100644 --- a/gpu/command_buffer/service/gl_interface.h +++ b/gpu/command_buffer/service/gl_interface.h @@ -275,6 +275,8 @@ class GLInterface { GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels) = 0; + virtual void ReleaseShaderCompiler(void) = 0; + virtual void RenderbufferStorageEXT( GLenum target, GLenum internalformat, GLsizei width, GLsizei height) = 0; @@ -282,6 +284,10 @@ class GLInterface { virtual void Scissor(GLint x, GLint y, GLsizei width, GLsizei height) = 0; + virtual void ShaderBinary( + GLsizei n, const GLuint* shaders, GLenum binaryformat, + const void* binary, GLsizei length) = 0; + virtual void ShaderSource( GLuint shader, GLsizei count, const char** str, const GLint* length) = 0; diff --git a/gpu/command_buffer/service/gl_mock.h b/gpu/command_buffer/service/gl_mock.h index 1ef66ea..ca038bb 100644 --- a/gpu/command_buffer/service/gl_mock.h +++ b/gpu/command_buffer/service/gl_mock.h @@ -247,6 +247,8 @@ class MockGLInterface : public GLInterface { GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels)); + MOCK_METHOD0(ReleaseShaderCompiler, void()); + MOCK_METHOD4(RenderbufferStorageEXT, void( GLenum target, GLenum internalformat, GLsizei width, GLsizei height)); @@ -254,6 +256,10 @@ class MockGLInterface : public GLInterface { MOCK_METHOD4(Scissor, void(GLint x, GLint y, GLsizei width, GLsizei height)); + MOCK_METHOD5(ShaderBinary, void( + GLsizei n, const GLuint* shaders, GLenum binaryformat, + const void* binary, GLsizei length)); + MOCK_METHOD4(ShaderSource, void( GLuint shader, GLsizei count, const char** str, const GLint* length)); diff --git a/gpu/command_buffer/service/gl_utils.h b/gpu/command_buffer/service/gl_utils.h index c5a3c98..ca8c630 100644 --- a/gpu/command_buffer/service/gl_utils.h +++ b/gpu/command_buffer/service/gl_utils.h @@ -69,6 +69,14 @@ #define GL_LOW_INT 0x8DF3 #define GL_MEDIUM_INT 0x8DF4 #define GL_HIGH_INT 0x8DF5 + #define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A + #define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B + #define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD + #define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB + #define GL_MAX_VARYING_VECTORS 0x8DFC + #define GL_SHADER_BINARY_FORMATS 0x8DF8 + #define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 + #define GL_SHADER_COMPILER 0x8DFA #endif // GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2 diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 8f9ef4e..706407a 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -606,6 +606,9 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, error::Error ShaderSourceHelper( GLuint shader, const char* data, uint32 data_size); + // Helper for glGetBooleanv, glGetFloatv and glGetIntegerv + bool GetHelper(GLenum pname, GLint* params, GLsizei* num_written); + // Wrapper for glCreateProgram void CreateProgramHelper(GLuint client_id); @@ -663,10 +666,19 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, // Wrapper for glGenerateMipmap void DoGenerateMipmap(GLenum target); + // Wrapper for DoGetBooleanv. + void DoGetBooleanv(GLenum pname, GLboolean* params); + + // Wrapper for DoGetFloatv. + void DoGetFloatv(GLenum pname, GLfloat* params); + // Wrapper for glGetFramebufferAttachmentParameteriv. void DoGetFramebufferAttachmentParameteriv( GLenum target, GLenum attachment, GLenum pname, GLint* params); + // Wrapper for DoGetIntegerv. + void DoGetIntegerv(GLenum pname, GLint* params); + // Wrapper for glRenderbufferParameteriv. void DoGetRenderbufferParameteriv( GLenum target, GLenum pname, GLint* params); @@ -685,6 +697,9 @@ class GLES2DecoderImpl : public base::SupportsWeakPtr<GLES2DecoderImpl>, void DoRenderbufferStorage( GLenum target, GLenum internalformat, GLsizei width, GLsizei height); + // Wrapper for glReleaseShaderCompiler. + void DoReleaseShaderCompiler() { } + // Wrappers for glTexParameter functions. void DoTexParameterf(GLenum target, GLenum pname, GLfloat param); void DoTexParameteri(GLenum target, GLenum pname, GLint param); @@ -1824,6 +1839,87 @@ void GLES2DecoderImpl::DoGenerateMipmap(GLenum target) { glGenerateMipmapEXT(target); } +bool GLES2DecoderImpl::GetHelper( + GLenum pname, GLint* params, GLsizei* num_written) { + DCHECK(params); + DCHECK(num_written); + switch (pname) { + case GL_IMPLEMENTATION_COLOR_READ_FORMAT: + *num_written = 1; + *params = GL_RGB; // TODO(gman): get correct format. + return true; + case GL_IMPLEMENTATION_COLOR_READ_TYPE: + *num_written = 1; + *params = GL_UNSIGNED_BYTE; // TODO(gman): get correct type. + return true; + case GL_MAX_FRAGMENT_UNIFORM_VECTORS: + *num_written = 1; + *params = 16; // TODO(gman): get correct value. + return true; + case GL_MAX_VARYING_VECTORS: + *num_written = 1; + *params = 8; // TODO(gman): get correct value. + return true; + case GL_MAX_VERTEX_UNIFORM_VECTORS: + *num_written = 1; + *params = 128; // TODO(gman): get correct value. + return true; + case GL_NUM_COMPRESSED_TEXTURE_FORMATS: + *num_written = 1; + *params = 0; // We don't support compressed textures. + return true; + case GL_NUM_SHADER_BINARY_FORMATS: + *num_written = 1; + *params = 0; // We don't support binary shader formats. + return true; + case GL_SHADER_BINARY_FORMATS: + *num_written = 0; + return true; // We don't support binary shader format.s + case GL_SHADER_COMPILER: + *num_written = 1; + *params = GL_TRUE; + return true; + default: + return false; + } +} + +void GLES2DecoderImpl::DoGetBooleanv(GLenum pname, GLboolean* params) { + DCHECK(params); + GLint values[16]; + GLsizei num_written; + if (GetHelper(pname, &values[0], &num_written)) { + DCHECK_LE(static_cast<size_t>(num_written), arraysize(values)); + for (GLsizei ii = 0; ii < num_written; ++ii) { + params[ii] = static_cast<GLboolean>(values[ii]); + } + } else { + glGetBooleanv(pname, params); + } +} + +void GLES2DecoderImpl::DoGetFloatv(GLenum pname, GLfloat* params) { + DCHECK(params); + GLint values[16]; + GLsizei num_written; + if (GetHelper(pname, &values[0], &num_written)) { + DCHECK_LE(static_cast<size_t>(num_written), arraysize(values)); + for (GLsizei ii = 0; ii < num_written; ++ii) { + params[ii] = static_cast<GLfloat>(values[ii]); + } + } else { + glGetFloatv(pname, params); + } +} + +void GLES2DecoderImpl::DoGetIntegerv(GLenum pname, GLint* params) { + DCHECK(params); + GLsizei num_written; + if (!GetHelper(pname, params, &num_written)) { + glGetIntegerv(pname, params); + } +} + error::Error GLES2DecoderImpl::HandleBindAttribLocation( uint32 immediate_data_size, const gles2::BindAttribLocation& c) { GLuint program; @@ -3207,6 +3303,47 @@ error::Error GLES2DecoderImpl::HandleGetActiveAttrib( return error::kNoError; } +error::Error GLES2DecoderImpl::HandleShaderBinary( + uint32 immediate_data_size, const gles2::ShaderBinary& c) { +#if 1 // No binary shader support. + SetGLError(GL_INVALID_OPERATION); + return error::kNoError; +#else + GLsizei n = static_cast<GLsizei>(c.n); + if (n < 0) { + SetGLError(GL_INVALID_VALUE); + return error::kNoError; + } + GLsizei length = static_cast<GLsizei>(c.length); + if (length < 0) { + SetGLError(GL_INVALID_VALUE); + return error::kNoError; + } + uint32 data_size; + if (!SafeMultiplyUint32(n, sizeof(GLuint), &data_size)) { + return error::kOutOfBounds; + } + const GLuint* shaders = GetSharedMemoryAs<const GLuint*>( + c.shaders_shm_id, c.shaders_shm_offset, data_size); + GLenum binaryformat = static_cast<GLenum>(c.binaryformat); + const void* binary = GetSharedMemoryAs<const void*>( + c.binary_shm_id, c.binary_shm_offset, length); + if (shaders == NULL || binary == NULL) { + return error::kOutOfBounds; + } + scoped_array<GLuint> service_ids(new GLuint[n]); + for (GLsizei ii = 0; ii < n; ++ii) { + if (!id_manager()->GetServiceId(shaders[ii], &service_ids[ii])) { + SetGLError(GL_INVALID_VALUE); + return error::kNoError; + } + // TODO(gman): Check that each shader exists. + } + // TODO(gman): call glShaderBinary + return error::kNoError; +#endif +} + error::Error GLES2DecoderImpl::HandleSwapBuffers( uint32 immediate_data_size, const gles2::SwapBuffers& c) { // Check a client created frame buffer is not bound. TODO(apatrick): diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h index cc862d1..01e9dd2 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h @@ -973,7 +973,7 @@ error::Error GLES2DecoderImpl::HandleGetBooleanv( return error::kInvalidArguments; } CopyRealGLErrorsToWrapper(); - glGetBooleanv(pname, params); + DoGetBooleanv(pname, params); GLenum error = glGetError(); if (error == GL_NO_ERROR) { result->SetNumResults(num_values); @@ -1058,7 +1058,7 @@ error::Error GLES2DecoderImpl::HandleGetFloatv( return error::kInvalidArguments; } CopyRealGLErrorsToWrapper(); - glGetFloatv(pname, params); + DoGetFloatv(pname, params); GLenum error = glGetError(); if (error == GL_NO_ERROR) { result->SetNumResults(num_values); @@ -1137,7 +1137,7 @@ error::Error GLES2DecoderImpl::HandleGetIntegerv( return error::kInvalidArguments; } CopyRealGLErrorsToWrapper(); - glGetIntegerv(pname, params); + DoGetIntegerv(pname, params); GLenum error = glGetError(); if (error == GL_NO_ERROR) { result->SetNumResults(num_values); @@ -1624,6 +1624,12 @@ error::Error GLES2DecoderImpl::HandlePolygonOffset( return error::kNoError; } +error::Error GLES2DecoderImpl::HandleReleaseShaderCompiler( + uint32 immediate_data_size, const gles2::ReleaseShaderCompiler& c) { + DoReleaseShaderCompiler(); + return error::kNoError; +} + error::Error GLES2DecoderImpl::HandleRenderbufferStorage( uint32 immediate_data_size, const gles2::RenderbufferStorage& c) { GLenum target = static_cast<GLenum>(c.target); diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h index 33eeb1f..203ec06 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h @@ -1849,5 +1849,7 @@ TEST_F(GLES2DecoderTest1, GetTexParameterivInvalidArgs2_1) { EXPECT_EQ(error::kOutOfBounds, ExecuteCmd(cmd)); EXPECT_EQ(0u, result->size); } +// TODO(gman): GetUniformfv + #endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_1_AUTOGEN_H_ diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h index 3412c4b..bdf34cf 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h @@ -8,8 +8,6 @@ #ifndef GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_2_AUTOGEN_H_ #define GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_2_AUTOGEN_H_ -// TODO(gman): GetUniformfv - // TODO(gman): GetUniformiv // TODO(gman): GetUniformLocation @@ -324,6 +322,7 @@ TEST_F(GLES2DecoderTest2, PolygonOffsetValidArgs) { } // TODO(gman): ReadPixels +// TODO(gman): ReleaseShaderCompiler TEST_F(GLES2DecoderTest2, RenderbufferStorageValidArgs) { EXPECT_CALL(*gl_, RenderbufferStorageEXT(GL_RENDERBUFFER, GL_RGBA4, 3, 4)); @@ -396,6 +395,8 @@ TEST_F(GLES2DecoderTest2, ScissorInvalidArgs3_0) { EXPECT_EQ(error::kNoError, ExecuteCmd(cmd)); EXPECT_EQ(GL_INVALID_VALUE, GetGLError()); } +// TODO(gman): ShaderBinary + // TODO(gman): ShaderSource // TODO(gman): ShaderSourceImmediate |