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 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
347 bool enforce_internal_framebuffer, | 347 bool enforce_internal_framebuffer, |
348 bool internal); | 348 bool internal); |
349 ~ScopedResolvedFrameBufferBinder(); | 349 ~ScopedResolvedFrameBufferBinder(); |
350 | 350 |
351 private: | 351 private: |
352 GLES2DecoderImpl* decoder_; | 352 GLES2DecoderImpl* decoder_; |
353 bool resolve_and_bind_; | 353 bool resolve_and_bind_; |
354 DISALLOW_COPY_AND_ASSIGN(ScopedResolvedFrameBufferBinder); | 354 DISALLOW_COPY_AND_ASSIGN(ScopedResolvedFrameBufferBinder); |
355 }; | 355 }; |
356 | 356 |
357 class ScopedModifyPixels { | |
358 public: | |
359 ScopedModifyPixels(TextureRef* ref); | |
piman
2014/03/13 04:41:58
nit: explicit
no sievers
2014/03/13 20:50:15
Done.
| |
360 ~ScopedModifyPixels(); | |
361 | |
362 private: | |
363 TextureRef* ref_; | |
364 }; | |
365 | |
366 ScopedModifyPixels::ScopedModifyPixels(TextureRef* ref) : ref_(ref) { | |
367 if (ref_) | |
368 ref_->texture()->OnWillModifyPixels(); | |
369 } | |
370 | |
371 ScopedModifyPixels::~ScopedModifyPixels() { | |
372 if (ref_) | |
373 ref_->texture()->OnDidModifyPixels(); | |
374 } | |
375 | |
376 class ScopedRenderTo { | |
377 public: | |
378 ScopedRenderTo(Framebuffer* framebuffer); | |
piman
2014/03/13 04:41:58
nit: explicit
no sievers
2014/03/13 20:50:15
Done.
| |
379 ~ScopedRenderTo(); | |
380 | |
381 private: | |
382 const Framebuffer::Attachment* color_buffer_; | |
383 }; | |
384 | |
385 ScopedRenderTo::ScopedRenderTo(Framebuffer* framebuffer) : color_buffer_(NULL) { | |
386 if (framebuffer) { | |
387 color_buffer_ = framebuffer->GetAttachment(GL_COLOR_ATTACHMENT0); | |
piman
2014/03/13 04:41:58
Do we need color attachments 1..n? Maybe depth/ste
no sievers
2014/03/13 20:50:15
Done.
| |
388 if (color_buffer_) | |
389 color_buffer_->OnWillRenderTo(); | |
390 } | |
391 } | |
392 | |
393 ScopedRenderTo::~ScopedRenderTo() { | |
394 if (color_buffer_) | |
395 color_buffer_->OnDidRenderTo(); | |
396 } | |
397 | |
357 // Encapsulates an OpenGL texture. | 398 // Encapsulates an OpenGL texture. |
358 class BackTexture { | 399 class BackTexture { |
359 public: | 400 public: |
360 explicit BackTexture(MemoryTracker* memory_tracker, ContextState* state); | 401 explicit BackTexture(MemoryTracker* memory_tracker, ContextState* state); |
361 ~BackTexture(); | 402 ~BackTexture(); |
362 | 403 |
363 // Create a new render texture. | 404 // Create a new render texture. |
364 void Create(); | 405 void Create(); |
365 | 406 |
366 // Set the initial size and format of a render texture or resize it. | 407 // Set the initial size and format of a render texture or resize it. |
(...skipping 6013 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6380 if (!SimulateAttrib0( | 6421 if (!SimulateAttrib0( |
6381 function_name, max_vertex_accessed, &simulated_attrib_0)) { | 6422 function_name, max_vertex_accessed, &simulated_attrib_0)) { |
6382 return error::kNoError; | 6423 return error::kNoError; |
6383 } | 6424 } |
6384 bool simulated_fixed_attribs = false; | 6425 bool simulated_fixed_attribs = false; |
6385 if (SimulateFixedAttribs( | 6426 if (SimulateFixedAttribs( |
6386 function_name, max_vertex_accessed, &simulated_fixed_attribs, | 6427 function_name, max_vertex_accessed, &simulated_fixed_attribs, |
6387 primcount)) { | 6428 primcount)) { |
6388 bool textures_set = !PrepareTexturesForRender(); | 6429 bool textures_set = !PrepareTexturesForRender(); |
6389 ApplyDirtyState(); | 6430 ApplyDirtyState(); |
6431 ScopedRenderTo do_render(framebuffer_state_.bound_draw_framebuffer.get()); | |
6390 if (!instanced) { | 6432 if (!instanced) { |
6391 glDrawArrays(mode, first, count); | 6433 glDrawArrays(mode, first, count); |
6392 } else { | 6434 } else { |
6393 glDrawArraysInstancedANGLE(mode, first, count, primcount); | 6435 glDrawArraysInstancedANGLE(mode, first, count, primcount); |
6394 } | 6436 } |
6395 ProcessPendingQueries(); | 6437 ProcessPendingQueries(); |
6396 if (textures_set) { | 6438 if (textures_set) { |
6397 RestoreStateForTextures(); | 6439 RestoreStateForTextures(); |
6398 } | 6440 } |
6399 if (simulated_fixed_attribs) { | 6441 if (simulated_fixed_attribs) { |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6509 // TODO(gman): Refactor to hide these details in BufferManager or | 6551 // TODO(gman): Refactor to hide these details in BufferManager or |
6510 // VertexAttribManager. | 6552 // VertexAttribManager. |
6511 const GLvoid* indices = reinterpret_cast<const GLvoid*>(offset); | 6553 const GLvoid* indices = reinterpret_cast<const GLvoid*>(offset); |
6512 bool used_client_side_array = false; | 6554 bool used_client_side_array = false; |
6513 if (element_array_buffer->IsClientSideArray()) { | 6555 if (element_array_buffer->IsClientSideArray()) { |
6514 used_client_side_array = true; | 6556 used_client_side_array = true; |
6515 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); | 6557 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); |
6516 indices = element_array_buffer->GetRange(offset, 0); | 6558 indices = element_array_buffer->GetRange(offset, 0); |
6517 } | 6559 } |
6518 | 6560 |
6561 ScopedRenderTo do_render(framebuffer_state_.bound_draw_framebuffer.get()); | |
6519 if (!instanced) { | 6562 if (!instanced) { |
6520 glDrawElements(mode, count, type, indices); | 6563 glDrawElements(mode, count, type, indices); |
6521 } else { | 6564 } else { |
6522 glDrawElementsInstancedANGLE(mode, count, type, indices, primcount); | 6565 glDrawElementsInstancedANGLE(mode, count, type, indices, primcount); |
6523 } | 6566 } |
6524 | 6567 |
6525 if (used_client_side_array) { | 6568 if (used_client_side_array) { |
6526 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, | 6569 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, |
6527 element_array_buffer->service_id()); | 6570 element_array_buffer->service_id()); |
6528 } | 6571 } |
(...skipping 1771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8300 width, height, texture->IsImmutable())) { | 8343 width, height, texture->IsImmutable())) { |
8301 LOCAL_SET_GL_ERROR( | 8344 LOCAL_SET_GL_ERROR( |
8302 GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big"); | 8345 GL_OUT_OF_MEMORY, "glCopyTexImage2D", "dimensions too big"); |
8303 return; | 8346 return; |
8304 } | 8347 } |
8305 if (copyHeight > 0 && copyWidth > 0) { | 8348 if (copyHeight > 0 && copyWidth > 0) { |
8306 GLint dx = copyX - x; | 8349 GLint dx = copyX - x; |
8307 GLint dy = copyY - y; | 8350 GLint dy = copyY - y; |
8308 GLint destX = dx; | 8351 GLint destX = dx; |
8309 GLint destY = dy; | 8352 GLint destY = dy; |
8353 ScopedModifyPixels modify(texture_ref); | |
8310 glCopyTexSubImage2D(target, level, | 8354 glCopyTexSubImage2D(target, level, |
8311 destX, destY, copyX, copyY, | 8355 destX, destY, copyX, copyY, |
8312 copyWidth, copyHeight); | 8356 copyWidth, copyHeight); |
8313 } | 8357 } |
8314 } else { | 8358 } else { |
8359 ScopedModifyPixels modify(texture_ref); | |
8315 glCopyTexImage2D(target, level, internal_format, | 8360 glCopyTexImage2D(target, level, internal_format, |
8316 copyX, copyY, copyWidth, copyHeight, border); | 8361 copyX, copyY, copyWidth, copyHeight, border); |
8317 } | 8362 } |
8318 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTexImage2D"); | 8363 GLenum error = LOCAL_PEEK_GL_ERROR("glCopyTexImage2D"); |
8319 if (error == GL_NO_ERROR) { | 8364 if (error == GL_NO_ERROR) { |
8320 texture_manager()->SetLevelInfo( | 8365 texture_manager()->SetLevelInfo( |
8321 texture_ref, target, level, internal_format, width, height, 1, | 8366 texture_ref, target, level, internal_format, width, height, 1, |
8322 border, internal_format, GL_UNSIGNED_BYTE, true); | 8367 border, internal_format, GL_UNSIGNED_BYTE, true); |
8323 } | 8368 } |
8324 } | 8369 } |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8404 uint32 pixels_size = 0; | 8449 uint32 pixels_size = 0; |
8405 if (!GLES2Util::ComputeImageDataSizes( | 8450 if (!GLES2Util::ComputeImageDataSizes( |
8406 width, height, format, type, state_.unpack_alignment, &pixels_size, | 8451 width, height, format, type, state_.unpack_alignment, &pixels_size, |
8407 NULL, NULL)) { | 8452 NULL, NULL)) { |
8408 LOCAL_SET_GL_ERROR( | 8453 LOCAL_SET_GL_ERROR( |
8409 GL_INVALID_VALUE, "glCopyTexSubImage2D", "dimensions too large"); | 8454 GL_INVALID_VALUE, "glCopyTexSubImage2D", "dimensions too large"); |
8410 return; | 8455 return; |
8411 } | 8456 } |
8412 scoped_ptr<char[]> zero(new char[pixels_size]); | 8457 scoped_ptr<char[]> zero(new char[pixels_size]); |
8413 memset(zero.get(), 0, pixels_size); | 8458 memset(zero.get(), 0, pixels_size); |
8459 ScopedModifyPixels modify(texture_ref); | |
8414 glTexSubImage2D( | 8460 glTexSubImage2D( |
8415 target, level, xoffset, yoffset, width, height, | 8461 target, level, xoffset, yoffset, width, height, |
8416 format, type, zero.get()); | 8462 format, type, zero.get()); |
8417 } | 8463 } |
8418 | 8464 |
8419 if (copyHeight > 0 && copyWidth > 0) { | 8465 if (copyHeight > 0 && copyWidth > 0) { |
8420 GLint dx = copyX - x; | 8466 GLint dx = copyX - x; |
8421 GLint dy = copyY - y; | 8467 GLint dy = copyY - y; |
8422 GLint destX = xoffset + dx; | 8468 GLint destX = xoffset + dx; |
8423 GLint destY = yoffset + dy; | 8469 GLint destY = yoffset + dy; |
8470 ScopedModifyPixels modify(texture_ref); | |
8424 glCopyTexSubImage2D(target, level, | 8471 glCopyTexSubImage2D(target, level, |
8425 destX, destY, copyX, copyY, | 8472 destX, destY, copyX, copyY, |
8426 copyWidth, copyHeight); | 8473 copyWidth, copyHeight); |
8427 } | 8474 } |
8428 } | 8475 } |
8429 | 8476 |
8430 bool GLES2DecoderImpl::ValidateTexSubImage2D( | 8477 bool GLES2DecoderImpl::ValidateTexSubImage2D( |
8431 error::Error* error, | 8478 error::Error* error, |
8432 const char* function_name, | 8479 const char* function_name, |
8433 GLenum target, | 8480 GLenum target, |
(...skipping 851 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9285 return error::kLostContext; | 9332 return error::kLostContext; |
9286 } | 9333 } |
9287 | 9334 |
9288 error::Error GLES2DecoderImpl::HandleInsertSyncPointCHROMIUM( | 9335 error::Error GLES2DecoderImpl::HandleInsertSyncPointCHROMIUM( |
9289 uint32 immediate_data_size, const cmds::InsertSyncPointCHROMIUM& c) { | 9336 uint32 immediate_data_size, const cmds::InsertSyncPointCHROMIUM& c) { |
9290 return error::kUnknownCommand; | 9337 return error::kUnknownCommand; |
9291 } | 9338 } |
9292 | 9339 |
9293 error::Error GLES2DecoderImpl::HandleWaitSyncPointCHROMIUM( | 9340 error::Error GLES2DecoderImpl::HandleWaitSyncPointCHROMIUM( |
9294 uint32 immediate_data_size, const cmds::WaitSyncPointCHROMIUM& c) { | 9341 uint32 immediate_data_size, const cmds::WaitSyncPointCHROMIUM& c) { |
9342 group_->mailbox_manager()->PullTextureUpdates(); | |
9295 if (wait_sync_point_callback_.is_null()) | 9343 if (wait_sync_point_callback_.is_null()) |
9296 return error::kNoError; | 9344 return error::kNoError; |
9297 | 9345 |
9298 return wait_sync_point_callback_.Run(c.sync_point) ? | 9346 return wait_sync_point_callback_.Run(c.sync_point) ? |
9299 error::kNoError : error::kDeferCommandUntilLater; | 9347 error::kNoError : error::kDeferCommandUntilLater; |
9300 } | 9348 } |
9301 | 9349 |
9302 error::Error GLES2DecoderImpl::HandleDiscardBackbufferCHROMIUM( | 9350 error::Error GLES2DecoderImpl::HandleDiscardBackbufferCHROMIUM( |
9303 uint32 immediate_data_size, const cmds::DiscardBackbufferCHROMIUM& c) { | 9351 uint32 immediate_data_size, const cmds::DiscardBackbufferCHROMIUM& c) { |
9304 if (surface_->DeferDraws()) | 9352 if (surface_->DeferDraws()) |
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9834 | 9882 |
9835 texture_manager()->SetLevelInfo( | 9883 texture_manager()->SetLevelInfo( |
9836 dest_texture_ref, GL_TEXTURE_2D, level, internal_format, source_width, | 9884 dest_texture_ref, GL_TEXTURE_2D, level, internal_format, source_width, |
9837 source_height, 1, 0, internal_format, dest_type, true); | 9885 source_height, 1, 0, internal_format, dest_type, true); |
9838 } else { | 9886 } else { |
9839 texture_manager()->SetLevelCleared( | 9887 texture_manager()->SetLevelCleared( |
9840 dest_texture_ref, GL_TEXTURE_2D, level, true); | 9888 dest_texture_ref, GL_TEXTURE_2D, level, true); |
9841 } | 9889 } |
9842 | 9890 |
9843 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); | 9891 DoWillUseTexImageIfNeeded(source_texture, source_texture->target()); |
9892 ScopedModifyPixels modify(dest_texture_ref); | |
9844 | 9893 |
9845 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix | 9894 // GL_TEXTURE_EXTERNAL_OES texture requires apply a transform matrix |
9846 // before presenting. | 9895 // before presenting. |
9847 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { | 9896 if (source_texture->target() == GL_TEXTURE_EXTERNAL_OES) { |
9848 // TODO(hkuang): get the StreamTexture transform matrix in GPU process | 9897 // TODO(hkuang): get the StreamTexture transform matrix in GPU process |
9849 // instead of using default matrix crbug.com/226218. | 9898 // instead of using default matrix crbug.com/226218. |
9850 const static GLfloat default_matrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, | 9899 const static GLfloat default_matrix[16] = {1.0f, 0.0f, 0.0f, 0.0f, |
9851 0.0f, 1.0f, 0.0f, 0.0f, | 9900 0.0f, 1.0f, 0.0f, 0.0f, |
9852 0.0f, 0.0f, 1.0f, 0.0f, | 9901 0.0f, 0.0f, 1.0f, 0.0f, |
9853 0.0f, 0.0f, 0.0f, 1.0f}; | 9902 0.0f, 0.0f, 0.0f, 1.0f}; |
(...skipping 686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10540 DoDidUseTexImageIfNeeded(texture, texture->target()); | 10589 DoDidUseTexImageIfNeeded(texture, texture->target()); |
10541 } | 10590 } |
10542 | 10591 |
10543 // Include the auto-generated part of this file. We split this because it means | 10592 // Include the auto-generated part of this file. We split this because it means |
10544 // we can easily edit the non-auto generated parts right here in this file | 10593 // we can easily edit the non-auto generated parts right here in this file |
10545 // instead of having to edit some template or the code generator. | 10594 // instead of having to edit some template or the code generator. |
10546 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 10595 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
10547 | 10596 |
10548 } // namespace gles2 | 10597 } // namespace gles2 |
10549 } // namespace gpu | 10598 } // namespace gpu |
OLD | NEW |