Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
index 7f9166e3ab9e2bbdd7d6c1872bd5dd43289c11c2..0870c36b889bcd266ba85c623819e3152fa514b6 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -2129,7 +2129,7 @@ bool BackTexture::AllocateStorage( |
ScopedTextureBinder binder(state_, id_, GL_TEXTURE_2D); |
uint32 image_size = 0; |
GLES2Util::ComputeImageDataSizes( |
- size.width(), size.height(), format, GL_UNSIGNED_BYTE, 8, &image_size, |
+ size.width(), size.height(), 1, format, GL_UNSIGNED_BYTE, 8, &image_size, |
NULL, NULL); |
if (!memory_tracker_.EnsureGPUMemoryAvailable(image_size)) { |
@@ -7682,7 +7682,7 @@ void GLES2DecoderImpl::FinishReadPixels( |
} |
} |
GLES2Util::ComputeImageDataSizes( |
- width, height, format, type, state_.pack_alignment, &pixels_size, |
+ width, height, 1, format, type, state_.pack_alignment, &pixels_size, |
NULL, NULL); |
void* pixels = GetSharedMemoryAs<void*>( |
c.pixels_shm_id, c.pixels_shm_offset, pixels_size); |
@@ -7729,7 +7729,7 @@ void GLES2DecoderImpl::FinishReadPixels( |
uint32 unpadded_row_size; |
uint32 padded_row_size; |
if (!GLES2Util::ComputeImageDataSizes( |
- width, 2, format, type, state_.pack_alignment, &temp_size, |
+ width, 2, 1, format, type, state_.pack_alignment, &temp_size, |
&unpadded_row_size, &padded_row_size)) { |
return; |
} |
@@ -7792,7 +7792,7 @@ error::Error GLES2DecoderImpl::HandleReadPixels(uint32 immediate_data_size, |
typedef cmds::ReadPixels::Result Result; |
uint32 pixels_size; |
if (!GLES2Util::ComputeImageDataSizes( |
- width, height, format, type, state_.pack_alignment, &pixels_size, |
+ width, height, 1, format, type, state_.pack_alignment, &pixels_size, |
NULL, NULL)) { |
return error::kOutOfBounds; |
} |
@@ -7868,7 +7868,7 @@ error::Error GLES2DecoderImpl::HandleReadPixels(uint32 immediate_data_size, |
uint32 unpadded_row_size; |
uint32 padded_row_size; |
if (!GLES2Util::ComputeImageDataSizes( |
- width, 2, format, type, state_.pack_alignment, &temp_size, |
+ width, 2, 1, format, type, state_.pack_alignment, &temp_size, |
&unpadded_row_size, &padded_row_size)) { |
LOCAL_SET_GL_ERROR( |
GL_INVALID_VALUE, "glReadPixels", "dimensions out of range"); |
@@ -7878,8 +7878,8 @@ error::Error GLES2DecoderImpl::HandleReadPixels(uint32 immediate_data_size, |
GLint dest_x_offset = std::max(-x, 0); |
uint32 dest_row_offset; |
if (!GLES2Util::ComputeImageDataSizes( |
- dest_x_offset, 1, format, type, state_.pack_alignment, &dest_row_offset, |
- NULL, NULL)) { |
+ dest_x_offset, 1, 1, format, type, state_.pack_alignment, |
+ &dest_row_offset, NULL, NULL)) { |
LOCAL_SET_GL_ERROR( |
GL_INVALID_VALUE, "glReadPixels", "dimensions out of range"); |
return error::kNoError; |
@@ -8321,7 +8321,7 @@ bool GLES2DecoderImpl::ClearLevel( |
uint32 size; |
uint32 padded_row_size; |
if (!GLES2Util::ComputeImageDataSizes( |
- width, height, format, type, state_.unpack_alignment, &size, |
+ width, height, 1, format, type, state_.unpack_alignment, &size, |
NULL, &padded_row_size)) { |
return false; |
} |
@@ -8339,7 +8339,7 @@ bool GLES2DecoderImpl::ClearLevel( |
DCHECK_GT(padded_row_size, 0U); |
tile_height = kMaxZeroSize / padded_row_size; |
if (!GLES2Util::ComputeImageDataSizes( |
- width, tile_height, format, type, state_.unpack_alignment, &size, |
+ width, tile_height, 1, format, type, state_.unpack_alignment, &size, |
NULL, NULL)) { |
return false; |
} |
@@ -8775,8 +8775,8 @@ error::Error GLES2DecoderImpl::HandleTexImage2D(uint32 immediate_data_size, |
uint32 pixels_shm_offset = static_cast<uint32>(c.pixels_shm_offset); |
uint32 pixels_size; |
if (!GLES2Util::ComputeImageDataSizes( |
- width, height, format, type, state_.unpack_alignment, &pixels_size, NULL, |
- NULL)) { |
+ width, height, 1, format, type, state_.unpack_alignment, &pixels_size, |
+ NULL, NULL)) { |
return error::kOutOfBounds; |
} |
const void* pixels = NULL; |
@@ -8800,6 +8800,51 @@ error::Error GLES2DecoderImpl::HandleTexImage2D(uint32 immediate_data_size, |
return error::kNoError; |
} |
+error::Error GLES2DecoderImpl::HandleTexImage3D(uint32 immediate_data_size, |
+ const void* cmd_data) { |
+ // TODO(zmo): Unsafe ES3 API. |
+ if (!unsafe_es3_apis_enabled()) |
+ return error::kUnknownCommand; |
+ |
+ const gles2::cmds::TexImage3D& c = |
+ *static_cast<const gles2::cmds::TexImage3D*>(cmd_data); |
+ TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleTexImage3D", |
+ "widthXheight", c.width * c.height, "depth", c.depth); |
+ GLenum target = static_cast<GLenum>(c.target); |
+ GLint level = static_cast<GLint>(c.level); |
+ GLenum internal_format = static_cast<GLenum>(c.internalformat); |
+ GLsizei width = static_cast<GLsizei>(c.width); |
+ GLsizei height = static_cast<GLsizei>(c.height); |
+ GLsizei depth = static_cast<GLsizei>(c.depth); |
+ GLint border = static_cast<GLint>(c.border); |
+ GLenum format = static_cast<GLenum>(c.format); |
+ GLenum type = static_cast<GLenum>(c.type); |
+ uint32 pixels_shm_id = static_cast<uint32>(c.pixels_shm_id); |
+ uint32 pixels_shm_offset = static_cast<uint32>(c.pixels_shm_offset); |
+ uint32 pixels_size; |
+ if (!GLES2Util::ComputeImageDataSizes( |
+ width, height, depth, format, type, state_.unpack_alignment, &pixels_size, |
+ NULL, NULL)) { |
+ return error::kOutOfBounds; |
+ } |
+ const void* pixels = NULL; |
+ if (pixels_shm_id != 0 || pixels_shm_offset != 0) { |
+ pixels = GetSharedMemoryAs<const void*>( |
+ pixels_shm_id, pixels_shm_offset, pixels_size); |
+ if (!pixels) { |
+ return error::kOutOfBounds; |
+ } |
+ } |
+ |
+ glTexImage3D(target, level, internal_format, width, height, depth, border, |
+ format, type, pixels); |
+ |
+ // This may be a slow command. Exit command processing to allow for |
+ // context preemption and GPU watchdog checks. |
+ ExitCommandProcessingEarly(); |
+ return error::kNoError; |
+} |
+ |
void GLES2DecoderImpl::DoCompressedTexSubImage2D( |
GLenum target, |
GLint level, |
@@ -8934,8 +8979,8 @@ void GLES2DecoderImpl::DoCopyTexImage2D( |
uint32 estimated_size = 0; |
if (!GLES2Util::ComputeImageDataSizes( |
- width, height, internal_format, GL_UNSIGNED_BYTE, state_.unpack_alignment, |
- &estimated_size, NULL, NULL)) { |
+ width, height, 1, internal_format, GL_UNSIGNED_BYTE, |
+ state_.unpack_alignment, &estimated_size, NULL, NULL)) { |
LOCAL_SET_GL_ERROR( |
GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too large"); |
return; |
@@ -9108,7 +9153,7 @@ void GLES2DecoderImpl::DoCopyTexSubImage2D( |
// some part was clipped so clear the sub rect. |
uint32 pixels_size = 0; |
if (!GLES2Util::ComputeImageDataSizes( |
- width, height, format, type, state_.unpack_alignment, &pixels_size, |
+ width, height, 1, format, type, state_.unpack_alignment, &pixels_size, |
NULL, NULL)) { |
LOCAL_SET_GL_ERROR( |
GL_INVALID_VALUE, "glCopyTexSubImage2D", "dimensions too large"); |
@@ -9293,7 +9338,7 @@ error::Error GLES2DecoderImpl::HandleTexSubImage2D(uint32 immediate_data_size, |
GLenum type = static_cast<GLenum>(c.type); |
uint32 data_size; |
if (!GLES2Util::ComputeImageDataSizes( |
- width, height, format, type, state_.unpack_alignment, &data_size, |
+ width, height, 1, format, type, state_.unpack_alignment, &data_size, |
NULL, NULL)) { |
return error::kOutOfBounds; |
} |
@@ -9303,6 +9348,48 @@ error::Error GLES2DecoderImpl::HandleTexSubImage2D(uint32 immediate_data_size, |
target, level, xoffset, yoffset, width, height, format, type, pixels); |
} |
+// TODO(zmo): Remove the below stub once we add the real function binding. |
+// Currently it's missing due to a gmock limitation. |
+static void glTexSubImage3D( |
+ GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, |
+ GLsizei height, GLsizei width, GLsizei depth, GLenum format, GLenum type, |
+ const void* pixels) { |
+ NOTIMPLEMENTED(); |
+} |
+ |
+error::Error GLES2DecoderImpl::HandleTexSubImage3D(uint32 immediate_data_size, |
+ const void* cmd_data) { |
+ // TODO(zmo): Unsafe ES3 API. |
+ if (!unsafe_es3_apis_enabled()) |
+ return error::kUnknownCommand; |
+ |
+ const gles2::cmds::TexSubImage3D& c = |
+ *static_cast<const gles2::cmds::TexSubImage3D*>(cmd_data); |
+ TRACE_EVENT2("gpu", "GLES2DecoderImpl::HandleTexSubImage3D", |
+ "widthXheight", c.width * c.height, "depth", c.depth); |
+ GLenum target = static_cast<GLenum>(c.target); |
+ GLint level = static_cast<GLint>(c.level); |
+ GLint xoffset = static_cast<GLint>(c.xoffset); |
+ GLint yoffset = static_cast<GLint>(c.yoffset); |
+ GLint zoffset = static_cast<GLint>(c.zoffset); |
+ GLsizei width = static_cast<GLsizei>(c.width); |
+ GLsizei height = static_cast<GLsizei>(c.height); |
+ GLsizei depth = static_cast<GLsizei>(c.depth); |
+ GLenum format = static_cast<GLenum>(c.format); |
+ GLenum type = static_cast<GLenum>(c.type); |
+ uint32 data_size; |
+ if (!GLES2Util::ComputeImageDataSizes( |
+ width, height, depth, format, type, state_.unpack_alignment, &data_size, |
+ NULL, NULL)) { |
+ return error::kOutOfBounds; |
+ } |
+ const void* pixels = GetSharedMemoryAs<const void*>( |
+ c.pixels_shm_id, c.pixels_shm_offset, data_size); |
+ glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, |
+ depth, format, type, pixels); |
+ return error::kNoError; |
+} |
+ |
error::Error GLES2DecoderImpl::HandleGetVertexAttribPointerv( |
uint32 immediate_data_size, |
const void* cmd_data) { |
@@ -10702,7 +10789,7 @@ void GLES2DecoderImpl::DoTexStorage2DEXT( |
for (int ii = 0; ii < levels; ++ii) { |
uint32 level_size = 0; |
if (!GLES2Util::ComputeImageDataSizes( |
- level_width, level_height, format, type, state_.unpack_alignment, |
+ level_width, level_height, 1, format, type, state_.unpack_alignment, |
&estimated_size, NULL, NULL) || |
!SafeAddUint32(estimated_size, level_size, &estimated_size)) { |
LOCAL_SET_GL_ERROR( |
@@ -11317,8 +11404,8 @@ error::Error GLES2DecoderImpl::HandleAsyncTexImage2DCHROMIUM( |
// TODO(epenner): Move this and copies of this memory validation |
// into ValidateTexImage2D step. |
if (!GLES2Util::ComputeImageDataSizes( |
- width, height, format, type, state_.unpack_alignment, &pixels_size, NULL, |
- NULL)) { |
+ width, height, 1, format, type, state_.unpack_alignment, &pixels_size, |
+ NULL, NULL)) { |
return error::kOutOfBounds; |
} |
const void* pixels = NULL; |
@@ -11422,7 +11509,7 @@ error::Error GLES2DecoderImpl::HandleAsyncTexSubImage2DCHROMIUM( |
// into ValidateTexSubImage2D step. |
uint32 data_size; |
if (!GLES2Util::ComputeImageDataSizes( |
- width, height, format, type, state_.unpack_alignment, &data_size, |
+ width, height, 1, format, type, state_.unpack_alignment, &data_size, |
NULL, NULL)) { |
return error::kOutOfBounds; |
} |