summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-11 00:13:56 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-11 00:13:56 +0000
commit8609397d9932b0f743dd4bbe55246632fb597945 (patch)
tree76292d97a3534cb53f2e8e55e50af4971efb50fb /gpu/command_buffer/service
parentb40e2c007431876d67d4c57b92135a2132719c0f (diff)
downloadchromium_src-8609397d9932b0f743dd4bbe55246632fb597945.zip
chromium_src-8609397d9932b0f743dd4bbe55246632fb597945.tar.gz
chromium_src-8609397d9932b0f743dd4bbe55246632fb597945.tar.bz2
Track the bound framebuffer and renderbuffer and
allow ID = 0 to make it through to the glBindXXX functions. TEST=none BUG=none Review URL: http://codereview.chromium.org/783002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@41226 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer/service')
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc35
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_autogen.h24
2 files changed, 47 insertions, 12 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 4b2e520..8c9be47 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -431,6 +431,12 @@ class GLES2DecoderImpl : public GLES2Decoder {
// Wrapper for glBindBuffer since we need to track the current targets.
void DoBindBuffer(GLenum target, GLuint buffer);
+ // Wrapper for glBindFramebuffer since we need to track the current targets.
+ void DoBindFramebuffer(GLenum target, GLuint framebuffer);
+
+ // Wrapper for glBindRenderbuffer since we need to track the current targets.
+ void DoBindRenderbuffer(GLenum target, GLuint renderbuffer);
+
// Wrapper for glBindTexture since we need to track the current targets.
void DoBindTexture(GLenum target, GLuint texture);
@@ -547,6 +553,8 @@ class GLES2DecoderImpl : public GLES2Decoder {
uint32 shm_id, uint32 shm_offset,
error::Error* error, GLuint* service_id, void** result);
+ bool ValidateGLenumCompressedTextureInternalFormat(GLenum format);
+
// Generate a member function prototype for each command in an automated and
// typesafe way.
#define GLES2_CMD_OP(name) \
@@ -599,6 +607,12 @@ class GLES2DecoderImpl : public GLES2Decoder {
// The program in use by glUseProgram
ProgramManager::ProgramInfo::Ref current_program_;
+ // The currently bound framebuffer
+ GLuint bound_framebuffer_;
+
+ // The currently bound renderbuffer
+ GLuint bound_renderbuffer_;
+
#if defined(UNIT_TEST)
#elif defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2)
#elif defined(OS_WIN)
@@ -636,6 +650,8 @@ GLES2DecoderImpl::GLES2DecoderImpl(ContextGroup* group)
active_texture_unit_(0),
black_2d_texture_id_(0),
black_cube_texture_id_(0),
+ bound_framebuffer_(0),
+ bound_renderbuffer_(0),
#if defined(UNIT_TEST)
#elif defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2)
#elif defined(OS_WIN)
@@ -1287,6 +1303,11 @@ void GLES2DecoderImpl::CreateShaderHelper(GLenum type, GLuint client_id) {
}
}
+bool GLES2DecoderImpl::ValidateGLenumCompressedTextureInternalFormat(GLenum) {
+ // TODO(gman): Add support for compressed texture formats.
+ return false;
+}
+
void GLES2DecoderImpl::DoActiveTexture(GLenum texture_unit) {
if (texture_unit > group_->max_texture_units()) {
SetGLError(GL_INVALID_ENUM);
@@ -1323,6 +1344,16 @@ void GLES2DecoderImpl::DoBindBuffer(GLenum target, GLuint buffer) {
glBindBuffer(target, buffer);
}
+void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint framebuffer) {
+ bound_framebuffer_ = framebuffer;
+ glBindFramebufferEXT(target, framebuffer);
+}
+
+void GLES2DecoderImpl::DoBindRenderbuffer(GLenum target, GLuint renderbuffer) {
+ bound_renderbuffer_ = renderbuffer;
+ glBindRenderbufferEXT(target, renderbuffer);
+}
+
void GLES2DecoderImpl::DoBindTexture(GLenum target, GLuint texture) {
TextureManager::TextureInfo* info = NULL;
if (texture) {
@@ -2125,9 +2156,9 @@ error::Error GLES2DecoderImpl::DoCompressedTexImage2D(
GLint border,
GLsizei image_size,
const void* data) {
- // TODO(gman): Validate internal_format
// TODO(gman): Validate image_size is correct for width, height and format.
- if (!ValidateGLenumTextureTarget(target)) {
+ if (!ValidateGLenumTextureTarget(target) ||
+ !ValidateGLenumCompressedTextureInternalFormat(internal_format)) {
SetGLError(GL_INVALID_ENUM);
return error::kNoError;
}
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
index eb66e7f..7b123bc 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -72,8 +72,9 @@ error::Error GLES2DecoderImpl::HandleBindAttribLocationImmediate(
error::Error GLES2DecoderImpl::HandleBindBuffer(
uint32 immediate_data_size, const gles2::BindBuffer& c) {
GLenum target = static_cast<GLenum>(c.target);
- GLuint buffer;
- if (!id_manager()->GetServiceId(c.buffer, &buffer)) {
+ GLuint buffer = c.buffer;
+ if (buffer != 0u &&
+ !id_manager()->GetServiceId(buffer, &buffer)) {
SetGLError(GL_INVALID_VALUE);
return error::kNoError;
}
@@ -88,8 +89,9 @@ error::Error GLES2DecoderImpl::HandleBindBuffer(
error::Error GLES2DecoderImpl::HandleBindFramebuffer(
uint32 immediate_data_size, const gles2::BindFramebuffer& c) {
GLenum target = static_cast<GLenum>(c.target);
- GLuint framebuffer;
- if (!id_manager()->GetServiceId(c.framebuffer, &framebuffer)) {
+ GLuint framebuffer = c.framebuffer;
+ if (framebuffer != 0u &&
+ !id_manager()->GetServiceId(framebuffer, &framebuffer)) {
SetGLError(GL_INVALID_VALUE);
return error::kNoError;
}
@@ -97,15 +99,16 @@ error::Error GLES2DecoderImpl::HandleBindFramebuffer(
SetGLError(GL_INVALID_ENUM);
return error::kNoError;
}
- glBindFramebufferEXT(target, framebuffer);
+ DoBindFramebuffer(target, framebuffer);
return error::kNoError;
}
error::Error GLES2DecoderImpl::HandleBindRenderbuffer(
uint32 immediate_data_size, const gles2::BindRenderbuffer& c) {
GLenum target = static_cast<GLenum>(c.target);
- GLuint renderbuffer;
- if (!id_manager()->GetServiceId(c.renderbuffer, &renderbuffer)) {
+ GLuint renderbuffer = c.renderbuffer;
+ if (renderbuffer != 0u &&
+ !id_manager()->GetServiceId(renderbuffer, &renderbuffer)) {
SetGLError(GL_INVALID_VALUE);
return error::kNoError;
}
@@ -113,15 +116,16 @@ error::Error GLES2DecoderImpl::HandleBindRenderbuffer(
SetGLError(GL_INVALID_ENUM);
return error::kNoError;
}
- glBindRenderbufferEXT(target, renderbuffer);
+ DoBindRenderbuffer(target, renderbuffer);
return error::kNoError;
}
error::Error GLES2DecoderImpl::HandleBindTexture(
uint32 immediate_data_size, const gles2::BindTexture& c) {
GLenum target = static_cast<GLenum>(c.target);
- GLuint texture;
- if (!id_manager()->GetServiceId(c.texture, &texture)) {
+ GLuint texture = c.texture;
+ if (texture != 0u &&
+ !id_manager()->GetServiceId(texture, &texture)) {
SetGLError(GL_INVALID_VALUE);
return error::kNoError;
}