summaryrefslogtreecommitdiffstats
path: root/gpu/command_buffer/service/gles2_cmd_decoder.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gpu/command_buffer/service/gles2_cmd_decoder.cc')
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc112
1 files changed, 55 insertions, 57 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index dbb49e9..54cef89 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -434,14 +434,6 @@ class GLES2DecoderImpl : public GLES2Decoder {
// Wrapper for glBindTexture since we need to track the current targets.
void DoBindTexture(GLenum target, GLuint texture);
- // Wrapper for BufferData.
- void DoBufferData(
- GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage);
-
- // Wrapper for BufferSubData.
- void DoBufferSubData(
- GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data);
-
// Wrapper for glCompileShader.
void DoCompileShader(GLuint shader);
@@ -1511,15 +1503,10 @@ void GLES2DecoderImpl::DoBindBuffer(GLenum target, GLuint buffer) {
BufferManager::BufferInfo* info = NULL;
if (buffer) {
info = GetBufferInfo(buffer);
- // Check the buffer exists
- // Check that we are not trying to bind it to a different target.
- if (!info || (info->target() != 0 && info->target() != target)) {
+ if (!info) {
SetGLError(GL_INVALID_OPERATION);
return;
}
- if (info->target() == 0) {
- info->set_target(target);
- }
}
switch (target) {
case GL_ARRAY_BUFFER:
@@ -1932,19 +1919,28 @@ error::Error GLES2DecoderImpl::HandleDrawElements(
!ValidateGLenumIndexType(type)) {
SetGLError(GL_INVALID_ENUM);
} else {
- GLuint max_vertex_accessed;
- if (!bound_element_array_buffer_->GetMaxValueForRange(
- offset, count, type, &max_vertex_accessed)) {
+ GLsizeiptr buffer_size = bound_element_array_buffer_->size();
+ if (offset > buffer_size) {
SetGLError(GL_INVALID_OPERATION);
} else {
- if (IsDrawValid(max_vertex_accessed)) {
- bool has_non_renderable_textures;
- SetBlackTextureForNonRenderableTextures(
- &has_non_renderable_textures);
+ GLsizei usable_size = buffer_size - offset;
+ GLsizei num_elements =
+ usable_size / GLES2Util::GetGLTypeSizeForTexturesAndBuffers(type);
+ if (count > num_elements) {
+ SetGLError(GL_INVALID_OPERATION);
+ } else {
const GLvoid* indices = reinterpret_cast<const GLvoid*>(offset);
- glDrawElements(mode, count, type, indices);
- if (has_non_renderable_textures) {
- RestoreStateForNonRenderableTextures();
+ GLuint max_vertex_accessed =
+ bound_element_array_buffer_->GetMaxValueForRange(
+ offset, count, type);
+ if (IsDrawValid(max_vertex_accessed)) {
+ bool has_non_renderable_textures;
+ SetBlackTextureForNonRenderableTextures(
+ &has_non_renderable_textures);
+ glDrawElements(mode, count, type, indices);
+ if (has_non_renderable_textures) {
+ RestoreStateForNonRenderableTextures();
+ }
}
}
}
@@ -2276,21 +2272,33 @@ error::Error GLES2DecoderImpl::HandleGetString(
return error::kNoError;
}
-void GLES2DecoderImpl::DoBufferData(
- GLenum target, GLsizeiptr size, const GLvoid * data, GLenum usage) {
+error::Error GLES2DecoderImpl::HandleBufferData(
+ uint32 immediate_data_size, const gles2::BufferData& c) {
+ GLenum target = static_cast<GLenum>(c.target);
+ GLsizeiptr size = static_cast<GLsizeiptr>(c.size);
+ uint32 data_shm_id = static_cast<uint32>(c.data_shm_id);
+ uint32 data_shm_offset = static_cast<uint32>(c.data_shm_offset);
+ GLenum usage = static_cast<GLenum>(c.usage);
+ const void* data = NULL;
+ if (data_shm_id != 0 || data_shm_offset != 0) {
+ data = GetSharedMemoryAs<const void*>(data_shm_id, data_shm_offset, size);
+ if (!data) {
+ return error::kOutOfBounds;
+ }
+ }
if (!ValidateGLenumBufferTarget(target) ||
!ValidateGLenumBufferUsage(usage)) {
SetGLError(GL_INVALID_ENUM);
- return;
+ return error::kNoError;
}
if (size < 0) {
SetGLError(GL_INVALID_VALUE);
- DoBufferData(target, size, data, usage);
+ return error::kNoError;
}
BufferManager::BufferInfo* info = GetBufferInfoForTarget(target);
if (!info) {
SetGLError(GL_INVALID_OPERATION);
- DoBufferData(target, size, data, usage);
+ return error::kNoError;
}
// Clear the buffer to 0 if no initial data was passed in.
scoped_array<int8> zero;
@@ -2305,26 +2313,8 @@ void GLES2DecoderImpl::DoBufferData(
if (error != GL_NO_ERROR) {
SetGLError(error);
} else {
- info->SetSize(size);
- info->SetRange(0, size, data);
+ info->set_size(size);
}
-}
-
-error::Error GLES2DecoderImpl::HandleBufferData(
- uint32 immediate_data_size, const gles2::BufferData& c) {
- GLenum target = static_cast<GLenum>(c.target);
- GLsizeiptr size = static_cast<GLsizeiptr>(c.size);
- uint32 data_shm_id = static_cast<uint32>(c.data_shm_id);
- uint32 data_shm_offset = static_cast<uint32>(c.data_shm_offset);
- GLenum usage = static_cast<GLenum>(c.usage);
- const void* data = NULL;
- if (data_shm_id != 0 || data_shm_offset != 0) {
- data = GetSharedMemoryAs<const void*>(data_shm_id, data_shm_offset, size);
- if (!data) {
- return error::kOutOfBounds;
- }
- }
- DoBufferData(target, size, data, usage);
return error::kNoError;
}
@@ -2338,21 +2328,29 @@ error::Error GLES2DecoderImpl::HandleBufferDataImmediate(
return error::kOutOfBounds;
}
GLenum usage = static_cast<GLenum>(c.usage);
- DoBufferData(target, size, data, usage);
- return error::kNoError;
-}
-
-void GLES2DecoderImpl::DoBufferSubData(
- GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid * data) {
+ if (!ValidateGLenumBufferTarget(target) ||
+ !ValidateGLenumBufferUsage(usage)) {
+ SetGLError(GL_INVALID_ENUM);
+ return error::kNoError;
+ }
+ if (size < 0) {
+ SetGLError(GL_INVALID_VALUE);
+ return error::kNoError;
+ }
BufferManager::BufferInfo* info = GetBufferInfoForTarget(target);
if (!info) {
SetGLError(GL_INVALID_OPERATION);
+ return error::kNoError;
}
- if (!info->SetRange(offset, size, data)) {
- SetGLError(GL_INVALID_VALUE);
+ CopyRealGLErrorsToWrapper();
+ glBufferData(target, size, data, usage);
+ GLenum error = glGetError();
+ if (error != GL_NO_ERROR) {
+ SetGLError(error);
} else {
- glBufferSubData(target, offset, size, data);
+ info->set_size(size);
}
+ return error::kNoError;
}
error::Error GLES2DecoderImpl::DoCompressedTexImage2D(