OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
6 | 6 |
7 #include <stdio.h> | 7 #include <stdio.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <list> | 10 #include <list> |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 gl_internal_format = GL_ALPHA16F_ARB; | 300 gl_internal_format = GL_ALPHA16F_ARB; |
301 break; | 301 break; |
302 default: | 302 default: |
303 NOTREACHED(); | 303 NOTREACHED(); |
304 break; | 304 break; |
305 } | 305 } |
306 } | 306 } |
307 return gl_internal_format; | 307 return gl_internal_format; |
308 } | 308 } |
309 | 309 |
| 310 static inline GLenum GetTexType(GLenum type) { |
| 311 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { |
| 312 if (type == GL_HALF_FLOAT_OES) |
| 313 return GL_HALF_FLOAT_ARB; |
| 314 } |
| 315 return type; |
| 316 } |
| 317 |
310 static void WrappedTexImage2D( | 318 static void WrappedTexImage2D( |
311 GLenum target, | 319 GLenum target, |
312 GLint level, | 320 GLint level, |
313 GLenum internal_format, | 321 GLenum internal_format, |
314 GLsizei width, | 322 GLsizei width, |
315 GLsizei height, | 323 GLsizei height, |
316 GLint border, | 324 GLint border, |
317 GLenum format, | 325 GLenum format, |
318 GLenum type, | 326 GLenum type, |
319 const void* pixels) { | 327 const void* pixels) { |
320 glTexImage2D( | 328 glTexImage2D( |
321 target, level, GetTexInternalFormat(internal_format, format, type), | 329 target, level, GetTexInternalFormat(internal_format, format, type), |
322 width, height, border, format, type, pixels); | 330 width, height, border, format, GetTexType(type), pixels); |
| 331 } |
| 332 |
| 333 static void WrappedTexSubImage2D( |
| 334 GLenum target, |
| 335 GLint level, |
| 336 GLint xoffset, |
| 337 GLint yoffset, |
| 338 GLsizei width, |
| 339 GLsizei height, |
| 340 GLenum format, |
| 341 GLenum type, |
| 342 const void * data) { |
| 343 glTexSubImage2D( |
| 344 target, level, xoffset, yoffset, width, height, format, |
| 345 GetTexType(type), data); |
323 } | 346 } |
324 | 347 |
325 // Wrapper for glEnable/glDisable that doesn't suck. | 348 // Wrapper for glEnable/glDisable that doesn't suck. |
326 static void EnableDisable(GLenum pname, bool enable) { | 349 static void EnableDisable(GLenum pname, bool enable) { |
327 if (enable) { | 350 if (enable) { |
328 glEnable(pname); | 351 glEnable(pname); |
329 } else { | 352 } else { |
330 glDisable(pname); | 353 glDisable(pname); |
331 } | 354 } |
332 } | 355 } |
(...skipping 6575 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6908 GLint read_width = read_end_x - read_x; | 6931 GLint read_width = read_end_x - read_x; |
6909 for (GLint yy = 0; yy < height; ++yy) { | 6932 for (GLint yy = 0; yy < height; ++yy) { |
6910 GLint ry = y + yy; | 6933 GLint ry = y + yy; |
6911 | 6934 |
6912 // Clear the row. | 6935 // Clear the row. |
6913 memset(dst, 0, unpadded_row_size); | 6936 memset(dst, 0, unpadded_row_size); |
6914 | 6937 |
6915 // If the row is in range, copy it. | 6938 // If the row is in range, copy it. |
6916 if (ry >= 0 && ry < max_size.height() && read_width > 0) { | 6939 if (ry >= 0 && ry < max_size.height() && read_width > 0) { |
6917 glReadPixels( | 6940 glReadPixels( |
6918 read_x, ry, read_width, 1, format, type, dst + dest_row_offset); | 6941 read_x, ry, read_width, 1, format, GetTexType(type), |
| 6942 dst + dest_row_offset); |
6919 } | 6943 } |
6920 dst += padded_row_size; | 6944 dst += padded_row_size; |
6921 } | 6945 } |
6922 } else { | 6946 } else { |
6923 glReadPixels(x, y, width, height, format, type, pixels); | 6947 glReadPixels(x, y, width, height, format, GetTexType(type), pixels); |
6924 } | 6948 } |
6925 GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels"); | 6949 GLenum error = LOCAL_PEEK_GL_ERROR("glReadPixels"); |
6926 if (error == GL_NO_ERROR) { | 6950 if (error == GL_NO_ERROR) { |
6927 if (result != NULL) { | 6951 if (result != NULL) { |
6928 *result = true; | 6952 *result = true; |
6929 } | 6953 } |
6930 | 6954 |
6931 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); | 6955 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); |
6932 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); | 6956 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); |
6933 if ((channels_exist & 0x0008) == 0 && | 6957 if ((channels_exist & 0x0008) == 0 && |
(...skipping 944 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7878 } | 7902 } |
7879 | 7903 |
7880 if (texture->IsAttachedToFramebuffer()) { | 7904 if (texture->IsAttachedToFramebuffer()) { |
7881 clear_state_dirty_ = true; | 7905 clear_state_dirty_ = true; |
7882 // TODO(gman): If textures tracked which framebuffers they were attached to | 7906 // TODO(gman): If textures tracked which framebuffers they were attached to |
7883 // we could just mark those framebuffers as not complete. | 7907 // we could just mark those framebuffers as not complete. |
7884 framebuffer_manager()->IncFramebufferStateChangeCount(); | 7908 framebuffer_manager()->IncFramebufferStateChangeCount(); |
7885 } | 7909 } |
7886 | 7910 |
7887 if (!teximage2d_faster_than_texsubimage2d_ && level_is_same && pixels) { | 7911 if (!teximage2d_faster_than_texsubimage2d_ && level_is_same && pixels) { |
7888 glTexSubImage2D(target, level, 0, 0, width, height, format, type, pixels); | 7912 WrappedTexSubImage2D(target, level, 0, 0, width, height, format, |
| 7913 type, pixels); |
7889 texture_manager()->SetLevelCleared(texture, target, level, true); | 7914 texture_manager()->SetLevelCleared(texture, target, level, true); |
7890 tex_image_2d_failed_ = false; | 7915 tex_image_2d_failed_ = false; |
7891 return; | 7916 return; |
7892 } | 7917 } |
7893 | 7918 |
7894 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glTexImage2D"); | 7919 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glTexImage2D"); |
7895 WrappedTexImage2D( | 7920 WrappedTexImage2D( |
7896 target, level, internal_format, width, height, border, format, type, | 7921 target, level, internal_format, width, height, border, format, type, |
7897 pixels); | 7922 pixels); |
7898 GLenum error = LOCAL_PEEK_GL_ERROR("glTexImage2D"); | 7923 GLenum error = LOCAL_PEEK_GL_ERROR("glTexImage2D"); |
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8368 bool ok = texture->GetLevelSize(target, level, &tex_width, &tex_height); | 8393 bool ok = texture->GetLevelSize(target, level, &tex_width, &tex_height); |
8369 DCHECK(ok); | 8394 DCHECK(ok); |
8370 if (xoffset != 0 || yoffset != 0 || | 8395 if (xoffset != 0 || yoffset != 0 || |
8371 width != tex_width || height != tex_height) { | 8396 width != tex_width || height != tex_height) { |
8372 if (!texture_manager()->ClearTextureLevel(this, texture, target, level)) { | 8397 if (!texture_manager()->ClearTextureLevel(this, texture, target, level)) { |
8373 LOCAL_SET_GL_ERROR( | 8398 LOCAL_SET_GL_ERROR( |
8374 GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big"); | 8399 GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big"); |
8375 return error::kNoError; | 8400 return error::kNoError; |
8376 } | 8401 } |
8377 ScopedTextureUploadTimer timer(this); | 8402 ScopedTextureUploadTimer timer(this); |
8378 glTexSubImage2D( | 8403 WrappedTexSubImage2D( |
8379 target, level, xoffset, yoffset, width, height, format, type, data); | 8404 target, level, xoffset, yoffset, width, height, format, type, data); |
8380 return error::kNoError; | 8405 return error::kNoError; |
8381 } | 8406 } |
8382 | 8407 |
8383 if (teximage2d_faster_than_texsubimage2d_ && !texture->IsImmutable()) { | 8408 if (teximage2d_faster_than_texsubimage2d_ && !texture->IsImmutable()) { |
8384 ScopedTextureUploadTimer timer(this); | 8409 ScopedTextureUploadTimer timer(this); |
8385 // NOTE: In OpenGL ES 2.0 border is always zero and format is always the | 8410 // NOTE: In OpenGL ES 2.0 border is always zero and format is always the |
8386 // same as internal_foramt. If that changes we'll need to look them up. | 8411 // same as internal_foramt. If that changes we'll need to look them up. |
8387 WrappedTexImage2D( | 8412 WrappedTexImage2D( |
8388 target, level, format, width, height, 0, format, type, data); | 8413 target, level, format, width, height, 0, format, type, data); |
8389 } else { | 8414 } else { |
8390 ScopedTextureUploadTimer timer(this); | 8415 ScopedTextureUploadTimer timer(this); |
8391 glTexSubImage2D( | 8416 WrappedTexSubImage2D( |
8392 target, level, xoffset, yoffset, width, height, format, type, data); | 8417 target, level, xoffset, yoffset, width, height, format, type, data); |
8393 } | 8418 } |
8394 texture_manager()->SetLevelCleared(texture, target, level, true); | 8419 texture_manager()->SetLevelCleared(texture, target, level, true); |
8395 return error::kNoError; | 8420 return error::kNoError; |
8396 } | 8421 } |
8397 | 8422 |
8398 error::Error GLES2DecoderImpl::HandleTexSubImage2D( | 8423 error::Error GLES2DecoderImpl::HandleTexSubImage2D( |
8399 uint32 immediate_data_size, const cmds::TexSubImage2D& c) { | 8424 uint32 immediate_data_size, const cmds::TexSubImage2D& c) { |
8400 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexSubImage2D"); | 8425 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexSubImage2D"); |
8401 GLboolean internal = static_cast<GLboolean>(c.internal); | 8426 GLboolean internal = static_cast<GLboolean>(c.internal); |
(...skipping 1861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10263 // it might need to be duped to prevent use-after-free of the memory. | 10288 // it might need to be duped to prevent use-after-free of the memory. |
10264 gpu::Buffer buffer = GetSharedMemoryBuffer(c.pixels_shm_id); | 10289 gpu::Buffer buffer = GetSharedMemoryBuffer(c.pixels_shm_id); |
10265 base::SharedMemory* shared_memory = buffer.shared_memory; | 10290 base::SharedMemory* shared_memory = buffer.shared_memory; |
10266 uint32 shm_size = buffer.size; | 10291 uint32 shm_size = buffer.size; |
10267 uint32 shm_data_offset = c.pixels_shm_offset; | 10292 uint32 shm_data_offset = c.pixels_shm_offset; |
10268 uint32 shm_data_size = pixels_size; | 10293 uint32 shm_data_size = pixels_size; |
10269 | 10294 |
10270 // Setup the parameters. | 10295 // Setup the parameters. |
10271 GLenum gl_internal_format = | 10296 GLenum gl_internal_format = |
10272 GetTexInternalFormat(internal_format, format, type); | 10297 GetTexInternalFormat(internal_format, format, type); |
| 10298 GLenum gl_type = GetTexType(type); |
10273 gfx::AsyncTexImage2DParams tex_params = {target, level, gl_internal_format, | 10299 gfx::AsyncTexImage2DParams tex_params = {target, level, gl_internal_format, |
10274 width, height, border, format, type}; | 10300 width, height, border, format, |
| 10301 gl_type}; |
10275 gfx::AsyncMemoryParams mem_params = {shared_memory, shm_size, | 10302 gfx::AsyncMemoryParams mem_params = {shared_memory, shm_size, |
10276 shm_data_offset, shm_data_size}; | 10303 shm_data_offset, shm_data_size}; |
10277 | 10304 |
10278 // Set up the async state if needed, and make the texture | 10305 // Set up the async state if needed, and make the texture |
10279 // immutable so the async state stays valid. The level info | 10306 // immutable so the async state stays valid. The level info |
10280 // is set up lazily when the transfer completes. | 10307 // is set up lazily when the transfer completes. |
10281 DCHECK(!texture->GetAsyncTransferState()); | 10308 DCHECK(!texture->GetAsyncTransferState()); |
10282 texture->SetAsyncTransferState( | 10309 texture->SetAsyncTransferState( |
10283 make_scoped_ptr( | 10310 make_scoped_ptr( |
10284 async_pixel_transfer_delegate_->CreatePixelTransferState( | 10311 async_pixel_transfer_delegate_->CreatePixelTransferState( |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10353 | 10380 |
10354 // We know the memory/size is safe, so get the real shared memory since | 10381 // We know the memory/size is safe, so get the real shared memory since |
10355 // it might need to be duped to prevent use-after-free of the memory. | 10382 // it might need to be duped to prevent use-after-free of the memory. |
10356 gpu::Buffer buffer = GetSharedMemoryBuffer(c.data_shm_id); | 10383 gpu::Buffer buffer = GetSharedMemoryBuffer(c.data_shm_id); |
10357 base::SharedMemory* shared_memory = buffer.shared_memory; | 10384 base::SharedMemory* shared_memory = buffer.shared_memory; |
10358 uint32 shm_size = buffer.size; | 10385 uint32 shm_size = buffer.size; |
10359 uint32 shm_data_offset = c.data_shm_offset; | 10386 uint32 shm_data_offset = c.data_shm_offset; |
10360 uint32 shm_data_size = data_size; | 10387 uint32 shm_data_size = data_size; |
10361 | 10388 |
10362 // Setup the parameters. | 10389 // Setup the parameters. |
| 10390 GLenum gl_type = GetTexType(type); |
10363 gfx::AsyncTexSubImage2DParams tex_params = {target, level, xoffset, yoffset, | 10391 gfx::AsyncTexSubImage2DParams tex_params = {target, level, xoffset, yoffset, |
10364 width, height, format, type}; | 10392 width, height, format, gl_type}; |
10365 gfx::AsyncMemoryParams mem_params = {shared_memory, shm_size, | 10393 gfx::AsyncMemoryParams mem_params = {shared_memory, shm_size, |
10366 shm_data_offset, shm_data_size}; | 10394 shm_data_offset, shm_data_size}; |
10367 if (!texture->GetAsyncTransferState()) { | 10395 if (!texture->GetAsyncTransferState()) { |
10368 // TODO(epenner): We may want to enforce exclusive use | 10396 // TODO(epenner): We may want to enforce exclusive use |
10369 // of async APIs in which case this should become an error, | 10397 // of async APIs in which case this should become an error, |
10370 // (the texture should have been async defined). | 10398 // (the texture should have been async defined). |
10371 gfx::AsyncTexImage2DParams define_params = {target, level, | 10399 gfx::AsyncTexImage2DParams define_params = {target, level, |
10372 0, 0, 0, 0, 0, 0}; | 10400 0, 0, 0, 0, 0, 0}; |
10373 texture->GetLevelSize(target, level, &define_params.width, | 10401 texture->GetLevelSize(target, level, &define_params.width, |
10374 &define_params.height); | 10402 &define_params.height); |
10375 texture->GetLevelType(target, level, &define_params.type, | 10403 texture->GetLevelType(target, level, &define_params.type, |
10376 &define_params.internal_format); | 10404 &define_params.internal_format); |
| 10405 |
| 10406 // Update the internal_format and type for PixelTransferState if needed. |
| 10407 define_params.internal_format = |
| 10408 GetTexInternalFormat(define_params.internal_format, |
| 10409 define_params.internal_format, type); |
| 10410 define_params.type = GetTexType(define_params.type); |
| 10411 |
10377 // Set up the async state if needed, and make the texture | 10412 // Set up the async state if needed, and make the texture |
10378 // immutable so the async state stays valid. | 10413 // immutable so the async state stays valid. |
10379 texture->SetAsyncTransferState( | 10414 texture->SetAsyncTransferState( |
10380 make_scoped_ptr( | 10415 make_scoped_ptr( |
10381 async_pixel_transfer_delegate_->CreatePixelTransferState( | 10416 async_pixel_transfer_delegate_->CreatePixelTransferState( |
10382 texture->service_id(), | 10417 texture->service_id(), |
10383 define_params))); | 10418 define_params))); |
10384 texture->SetImmutable(true); | 10419 texture->SetImmutable(true); |
10385 } | 10420 } |
10386 | 10421 |
(...skipping 25 matching lines...) Expand all Loading... |
10412 return error::kNoError; | 10447 return error::kNoError; |
10413 } | 10448 } |
10414 | 10449 |
10415 // Include the auto-generated part of this file. We split this because it means | 10450 // Include the auto-generated part of this file. We split this because it means |
10416 // we can easily edit the non-auto generated parts right here in this file | 10451 // we can easily edit the non-auto generated parts right here in this file |
10417 // instead of having to edit some template or the code generator. | 10452 // instead of having to edit some template or the code generator. |
10418 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10453 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
10419 | 10454 |
10420 } // namespace gles2 | 10455 } // namespace gles2 |
10421 } // namespace gpu | 10456 } // namespace gpu |
OLD | NEW |