Chromium Code Reviews| 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 7545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7878 } | 7901 } |
| 7879 | 7902 |
| 7880 if (texture->IsAttachedToFramebuffer()) { | 7903 if (texture->IsAttachedToFramebuffer()) { |
| 7881 clear_state_dirty_ = true; | 7904 clear_state_dirty_ = true; |
| 7882 // TODO(gman): If textures tracked which framebuffers they were attached to | 7905 // TODO(gman): If textures tracked which framebuffers they were attached to |
| 7883 // we could just mark those framebuffers as not complete. | 7906 // we could just mark those framebuffers as not complete. |
| 7884 framebuffer_manager()->IncFramebufferStateChangeCount(); | 7907 framebuffer_manager()->IncFramebufferStateChangeCount(); |
| 7885 } | 7908 } |
| 7886 | 7909 |
| 7887 if (!teximage2d_faster_than_texsubimage2d_ && level_is_same && pixels) { | 7910 if (!teximage2d_faster_than_texsubimage2d_ && level_is_same && pixels) { |
| 7888 glTexSubImage2D(target, level, 0, 0, width, height, format, type, pixels); | 7911 WrappedTexSubImage2D(target, level, 0, 0, width, height, format, |
| 7912 type, pixels); | |
| 7889 texture_manager()->SetLevelCleared(texture, target, level, true); | 7913 texture_manager()->SetLevelCleared(texture, target, level, true); |
| 7890 tex_image_2d_failed_ = false; | 7914 tex_image_2d_failed_ = false; |
| 7891 return; | 7915 return; |
| 7892 } | 7916 } |
| 7893 | 7917 |
| 7894 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glTexImage2D"); | 7918 LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER("glTexImage2D"); |
| 7895 WrappedTexImage2D( | 7919 WrappedTexImage2D( |
| 7896 target, level, internal_format, width, height, border, format, type, | 7920 target, level, internal_format, width, height, border, format, type, |
| 7897 pixels); | 7921 pixels); |
| 7898 GLenum error = LOCAL_PEEK_GL_ERROR("glTexImage2D"); | 7922 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); | 8392 bool ok = texture->GetLevelSize(target, level, &tex_width, &tex_height); |
| 8369 DCHECK(ok); | 8393 DCHECK(ok); |
| 8370 if (xoffset != 0 || yoffset != 0 || | 8394 if (xoffset != 0 || yoffset != 0 || |
| 8371 width != tex_width || height != tex_height) { | 8395 width != tex_width || height != tex_height) { |
| 8372 if (!texture_manager()->ClearTextureLevel(this, texture, target, level)) { | 8396 if (!texture_manager()->ClearTextureLevel(this, texture, target, level)) { |
| 8373 LOCAL_SET_GL_ERROR( | 8397 LOCAL_SET_GL_ERROR( |
| 8374 GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big"); | 8398 GL_OUT_OF_MEMORY, "glTexSubImage2D", "dimensions too big"); |
| 8375 return error::kNoError; | 8399 return error::kNoError; |
| 8376 } | 8400 } |
| 8377 ScopedTextureUploadTimer timer(this); | 8401 ScopedTextureUploadTimer timer(this); |
| 8378 glTexSubImage2D( | 8402 WrappedTexSubImage2D( |
| 8379 target, level, xoffset, yoffset, width, height, format, type, data); | 8403 target, level, xoffset, yoffset, width, height, format, type, data); |
| 8380 return error::kNoError; | 8404 return error::kNoError; |
| 8381 } | 8405 } |
| 8382 | 8406 |
| 8383 if (teximage2d_faster_than_texsubimage2d_ && !texture->IsImmutable()) { | 8407 if (teximage2d_faster_than_texsubimage2d_ && !texture->IsImmutable()) { |
| 8384 ScopedTextureUploadTimer timer(this); | 8408 ScopedTextureUploadTimer timer(this); |
| 8385 // NOTE: In OpenGL ES 2.0 border is always zero and format is always the | 8409 // 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. | 8410 // same as internal_foramt. If that changes we'll need to look them up. |
| 8387 WrappedTexImage2D( | 8411 WrappedTexImage2D( |
| 8388 target, level, format, width, height, 0, format, type, data); | 8412 target, level, format, width, height, 0, format, type, data); |
| 8389 } else { | 8413 } else { |
| 8390 ScopedTextureUploadTimer timer(this); | 8414 ScopedTextureUploadTimer timer(this); |
| 8391 glTexSubImage2D( | 8415 WrappedTexSubImage2D( |
| 8392 target, level, xoffset, yoffset, width, height, format, type, data); | 8416 target, level, xoffset, yoffset, width, height, format, type, data); |
| 8393 } | 8417 } |
| 8394 texture_manager()->SetLevelCleared(texture, target, level, true); | 8418 texture_manager()->SetLevelCleared(texture, target, level, true); |
| 8395 return error::kNoError; | 8419 return error::kNoError; |
| 8396 } | 8420 } |
| 8397 | 8421 |
| 8398 error::Error GLES2DecoderImpl::HandleTexSubImage2D( | 8422 error::Error GLES2DecoderImpl::HandleTexSubImage2D( |
| 8399 uint32 immediate_data_size, const cmds::TexSubImage2D& c) { | 8423 uint32 immediate_data_size, const cmds::TexSubImage2D& c) { |
| 8400 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexSubImage2D"); | 8424 TRACE_EVENT0("gpu", "GLES2DecoderImpl::HandleTexSubImage2D"); |
| 8401 GLboolean internal = static_cast<GLboolean>(c.internal); | 8425 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. | 10287 // it might need to be duped to prevent use-after-free of the memory. |
| 10264 gpu::Buffer buffer = GetSharedMemoryBuffer(c.pixels_shm_id); | 10288 gpu::Buffer buffer = GetSharedMemoryBuffer(c.pixels_shm_id); |
| 10265 base::SharedMemory* shared_memory = buffer.shared_memory; | 10289 base::SharedMemory* shared_memory = buffer.shared_memory; |
| 10266 uint32 shm_size = buffer.size; | 10290 uint32 shm_size = buffer.size; |
| 10267 uint32 shm_data_offset = c.pixels_shm_offset; | 10291 uint32 shm_data_offset = c.pixels_shm_offset; |
| 10268 uint32 shm_data_size = pixels_size; | 10292 uint32 shm_data_size = pixels_size; |
| 10269 | 10293 |
| 10270 // Setup the parameters. | 10294 // Setup the parameters. |
| 10271 GLenum gl_internal_format = | 10295 GLenum gl_internal_format = |
| 10272 GetTexInternalFormat(internal_format, format, type); | 10296 GetTexInternalFormat(internal_format, format, type); |
| 10297 GLenum gl_type = GetTexType(type); | |
|
greggman
2013/05/03 06:26:21
Hey Jun, Sorry about this but I just remembered th
| |
| 10273 gfx::AsyncTexImage2DParams tex_params = {target, level, gl_internal_format, | 10298 gfx::AsyncTexImage2DParams tex_params = {target, level, gl_internal_format, |
| 10274 width, height, border, format, type}; | 10299 width, height, border, format, |
| 10300 gl_type}; | |
| 10275 gfx::AsyncMemoryParams mem_params = {shared_memory, shm_size, | 10301 gfx::AsyncMemoryParams mem_params = {shared_memory, shm_size, |
| 10276 shm_data_offset, shm_data_size}; | 10302 shm_data_offset, shm_data_size}; |
| 10277 | 10303 |
| 10278 // Set up the async state if needed, and make the texture | 10304 // Set up the async state if needed, and make the texture |
| 10279 // immutable so the async state stays valid. The level info | 10305 // immutable so the async state stays valid. The level info |
| 10280 // is set up lazily when the transfer completes. | 10306 // is set up lazily when the transfer completes. |
| 10281 DCHECK(!texture->GetAsyncTransferState()); | 10307 DCHECK(!texture->GetAsyncTransferState()); |
| 10282 texture->SetAsyncTransferState( | 10308 texture->SetAsyncTransferState( |
| 10283 make_scoped_ptr( | 10309 make_scoped_ptr( |
| 10284 async_pixel_transfer_delegate_->CreatePixelTransferState( | 10310 async_pixel_transfer_delegate_->CreatePixelTransferState( |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10353 | 10379 |
| 10354 // We know the memory/size is safe, so get the real shared memory since | 10380 // 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. | 10381 // it might need to be duped to prevent use-after-free of the memory. |
| 10356 gpu::Buffer buffer = GetSharedMemoryBuffer(c.data_shm_id); | 10382 gpu::Buffer buffer = GetSharedMemoryBuffer(c.data_shm_id); |
| 10357 base::SharedMemory* shared_memory = buffer.shared_memory; | 10383 base::SharedMemory* shared_memory = buffer.shared_memory; |
| 10358 uint32 shm_size = buffer.size; | 10384 uint32 shm_size = buffer.size; |
| 10359 uint32 shm_data_offset = c.data_shm_offset; | 10385 uint32 shm_data_offset = c.data_shm_offset; |
| 10360 uint32 shm_data_size = data_size; | 10386 uint32 shm_data_size = data_size; |
| 10361 | 10387 |
| 10362 // Setup the parameters. | 10388 // Setup the parameters. |
| 10389 GLenum gl_type = GetTexType(type); | |
| 10363 gfx::AsyncTexSubImage2DParams tex_params = {target, level, xoffset, yoffset, | 10390 gfx::AsyncTexSubImage2DParams tex_params = {target, level, xoffset, yoffset, |
| 10364 width, height, format, type}; | 10391 width, height, format, gl_type}; |
| 10365 gfx::AsyncMemoryParams mem_params = {shared_memory, shm_size, | 10392 gfx::AsyncMemoryParams mem_params = {shared_memory, shm_size, |
| 10366 shm_data_offset, shm_data_size}; | 10393 shm_data_offset, shm_data_size}; |
| 10367 if (!texture->GetAsyncTransferState()) { | 10394 if (!texture->GetAsyncTransferState()) { |
| 10368 // TODO(epenner): We may want to enforce exclusive use | 10395 // TODO(epenner): We may want to enforce exclusive use |
| 10369 // of async APIs in which case this should become an error, | 10396 // of async APIs in which case this should become an error, |
| 10370 // (the texture should have been async defined). | 10397 // (the texture should have been async defined). |
| 10371 gfx::AsyncTexImage2DParams define_params = {target, level, | 10398 gfx::AsyncTexImage2DParams define_params = {target, level, |
| 10372 0, 0, 0, 0, 0, 0}; | 10399 0, 0, 0, 0, 0, 0}; |
| 10373 texture->GetLevelSize(target, level, &define_params.width, | 10400 texture->GetLevelSize(target, level, &define_params.width, |
| 10374 &define_params.height); | 10401 &define_params.height); |
| 10375 texture->GetLevelType(target, level, &define_params.type, | 10402 texture->GetLevelType(target, level, &define_params.type, |
| 10376 &define_params.internal_format); | 10403 &define_params.internal_format); |
| 10404 | |
| 10405 // Update the internal_format and type for PixelTransferState if needed. | |
| 10406 define_params.internal_format = | |
| 10407 GetTexInternalFormat(define_params.internal_format, | |
| 10408 define_params.internal_format, type); | |
| 10409 define_params.type = GetTexType(define_params.type); | |
| 10410 | |
| 10377 // Set up the async state if needed, and make the texture | 10411 // Set up the async state if needed, and make the texture |
| 10378 // immutable so the async state stays valid. | 10412 // immutable so the async state stays valid. |
| 10379 texture->SetAsyncTransferState( | 10413 texture->SetAsyncTransferState( |
| 10380 make_scoped_ptr( | 10414 make_scoped_ptr( |
| 10381 async_pixel_transfer_delegate_->CreatePixelTransferState( | 10415 async_pixel_transfer_delegate_->CreatePixelTransferState( |
| 10382 texture->service_id(), | 10416 texture->service_id(), |
| 10383 define_params))); | 10417 define_params))); |
| 10384 texture->SetImmutable(true); | 10418 texture->SetImmutable(true); |
| 10385 } | 10419 } |
| 10386 | 10420 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 10412 return error::kNoError; | 10446 return error::kNoError; |
| 10413 } | 10447 } |
| 10414 | 10448 |
| 10415 // Include the auto-generated part of this file. We split this because it means | 10449 // 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 | 10450 // 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. | 10451 // instead of having to edit some template or the code generator. |
| 10418 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10452 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 10419 | 10453 |
| 10420 } // namespace gles2 | 10454 } // namespace gles2 |
| 10421 } // namespace gpu | 10455 } // namespace gpu |
| OLD | NEW |