summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-12 17:23:58 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-12 17:23:58 +0000
commitb273e43cebe9f829f9e871bc27ddf5cea4feef28 (patch)
tree2db79f311c3f080d44dc1f99fc5548b4beaf6112 /gpu/command_buffer/service
parentd382b18cd1dafdadc6e55843e48cb78f0f99a1b9 (diff)
downloadchromium_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')
-rw-r--r--gpu/command_buffer/service/gl_interface.h6
-rw-r--r--gpu/command_buffer/service/gl_mock.h6
-rw-r--r--gpu/command_buffer/service/gl_utils.h8
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc137
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_autogen.h12
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_1_autogen.h2
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_2_autogen.h5
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