| 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 664 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 bool BoundFramebufferHasColorAttachmentWithAlpha(bool all_draw_buffers); | 675 bool BoundFramebufferHasColorAttachmentWithAlpha(bool all_draw_buffers); |
| 676 bool BoundFramebufferHasDepthAttachment(); | 676 bool BoundFramebufferHasDepthAttachment(); |
| 677 bool BoundFramebufferHasStencilAttachment(); | 677 bool BoundFramebufferHasStencilAttachment(); |
| 678 | 678 |
| 679 error::ContextLostReason GetContextLostReason() override; | 679 error::ContextLostReason GetContextLostReason() override; |
| 680 | 680 |
| 681 // Overridden from FramebufferManager::TextureDetachObserver: | 681 // Overridden from FramebufferManager::TextureDetachObserver: |
| 682 void OnTextureRefDetachedFromFramebuffer(TextureRef* texture) override; | 682 void OnTextureRefDetachedFromFramebuffer(TextureRef* texture) override; |
| 683 | 683 |
| 684 // Overriden from ErrorStateClient. | 684 // Overriden from ErrorStateClient. |
| 685 void OnContextLostError() override; |
| 685 void OnOutOfMemoryError() override; | 686 void OnOutOfMemoryError() override; |
| 686 | 687 |
| 687 // Ensure Renderbuffer corresponding to last DoBindRenderbuffer() is bound. | 688 // Ensure Renderbuffer corresponding to last DoBindRenderbuffer() is bound. |
| 688 void EnsureRenderbufferBound(); | 689 void EnsureRenderbufferBound(); |
| 689 | 690 |
| 690 // Helpers to facilitate calling into compatible extensions. | 691 // Helpers to facilitate calling into compatible extensions. |
| 691 static void RenderbufferStorageMultisampleHelper( | 692 static void RenderbufferStorageMultisampleHelper( |
| 692 const FeatureInfo* feature_info, | 693 const FeatureInfo* feature_info, |
| 693 GLenum target, | 694 GLenum target, |
| 694 GLsizei samples, | 695 GLsizei samples, |
| (...skipping 1940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2635 // mailing list archives. It also implicitly enables the desktop GL | 2636 // mailing list archives. It also implicitly enables the desktop GL |
| 2636 // capability GL_POINT_SPRITE to provide access to the gl_PointCoord | 2637 // capability GL_POINT_SPRITE to provide access to the gl_PointCoord |
| 2637 // variable in fragment shaders. | 2638 // variable in fragment shaders. |
| 2638 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { | 2639 if (gfx::GetGLImplementation() != gfx::kGLImplementationEGLGLES2) { |
| 2639 glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); | 2640 glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); |
| 2640 glEnable(GL_POINT_SPRITE); | 2641 glEnable(GL_POINT_SPRITE); |
| 2641 } | 2642 } |
| 2642 | 2643 |
| 2643 has_robustness_extension_ = | 2644 has_robustness_extension_ = |
| 2644 context->HasExtension("GL_ARB_robustness") || | 2645 context->HasExtension("GL_ARB_robustness") || |
| 2646 context->HasExtension("GL_KHR_robustness") || |
| 2645 context->HasExtension("GL_EXT_robustness"); | 2647 context->HasExtension("GL_EXT_robustness"); |
| 2646 | 2648 |
| 2647 if (!InitializeShaderTranslator()) { | 2649 if (!InitializeShaderTranslator()) { |
| 2648 return false; | 2650 return false; |
| 2649 } | 2651 } |
| 2650 | 2652 |
| 2651 state_.viewport_width = size.width(); | 2653 state_.viewport_width = size.width(); |
| 2652 state_.viewport_height = size.height(); | 2654 state_.viewport_height = size.height(); |
| 2653 | 2655 |
| 2654 GLint viewport_params[4] = { 0 }; | 2656 GLint viewport_params[4] = { 0 }; |
| (...skipping 3818 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6473 max_vertex_accessed); | 6475 max_vertex_accessed); |
| 6474 GLuint num_vertices = max_accessed + 1; | 6476 GLuint num_vertices = max_accessed + 1; |
| 6475 if (num_vertices == 0) { | 6477 if (num_vertices == 0) { |
| 6476 LOCAL_SET_GL_ERROR( | 6478 LOCAL_SET_GL_ERROR( |
| 6477 GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0"); | 6479 GL_OUT_OF_MEMORY, function_name, "Simulating attrib 0"); |
| 6478 return false; | 6480 return false; |
| 6479 } | 6481 } |
| 6480 if (attrib_info && | 6482 if (attrib_info && |
| 6481 attrib->CanAccess(max_accessed) && | 6483 attrib->CanAccess(max_accessed) && |
| 6482 attrib->type() == GL_FIXED) { | 6484 attrib->type() == GL_FIXED) { |
| 6483 int num_elements = attrib->size() * kSizeOfFloat; | 6485 int num_elements = attrib->size() * num_vertices; |
| 6484 int size = num_elements * num_vertices; | 6486 const int src_size = num_elements * sizeof(int32); |
| 6485 scoped_ptr<float[]> data(new float[size]); | 6487 const int dst_size = num_elements * sizeof(float); |
| 6488 scoped_ptr<float[]> data(new float[num_elements]); |
| 6486 const int32* src = reinterpret_cast<const int32 *>( | 6489 const int32* src = reinterpret_cast<const int32 *>( |
| 6487 attrib->buffer()->GetRange(attrib->offset(), size)); | 6490 attrib->buffer()->GetRange(attrib->offset(), src_size)); |
| 6488 const int32* end = src + num_elements; | 6491 const int32* end = src + num_elements; |
| 6489 float* dst = data.get(); | 6492 float* dst = data.get(); |
| 6490 while (src != end) { | 6493 while (src != end) { |
| 6491 *dst++ = static_cast<float>(*src++) / 65536.0f; | 6494 *dst++ = static_cast<float>(*src++) / 65536.0f; |
| 6492 } | 6495 } |
| 6493 glBufferSubData(GL_ARRAY_BUFFER, offset, size, data.get()); | 6496 glBufferSubData(GL_ARRAY_BUFFER, offset, dst_size, data.get()); |
| 6494 glVertexAttribPointer( | 6497 glVertexAttribPointer( |
| 6495 attrib->index(), attrib->size(), GL_FLOAT, false, 0, | 6498 attrib->index(), attrib->size(), GL_FLOAT, false, 0, |
| 6496 reinterpret_cast<GLvoid*>(offset)); | 6499 reinterpret_cast<GLvoid*>(offset)); |
| 6497 offset += size; | 6500 offset += dst_size; |
| 6498 } | 6501 } |
| 6499 } | 6502 } |
| 6500 *simulated = true; | 6503 *simulated = true; |
| 6501 return true; | 6504 return true; |
| 6502 } | 6505 } |
| 6503 | 6506 |
| 6504 void GLES2DecoderImpl::RestoreStateForSimulatedFixedAttribs() { | 6507 void GLES2DecoderImpl::RestoreStateForSimulatedFixedAttribs() { |
| 6505 // There's no need to call glVertexAttribPointer because we shadow all the | 6508 // There's no need to call glVertexAttribPointer because we shadow all the |
| 6506 // settings and passing GL_FIXED to it will not work. | 6509 // settings and passing GL_FIXED to it will not work. |
| 6507 glBindBuffer( | 6510 glBindBuffer( |
| (...skipping 3218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9726 bool GLES2DecoderImpl::WasContextLostByRobustnessExtension() { | 9729 bool GLES2DecoderImpl::WasContextLostByRobustnessExtension() { |
| 9727 return WasContextLost() && reset_by_robustness_extension_; | 9730 return WasContextLost() && reset_by_robustness_extension_; |
| 9728 } | 9731 } |
| 9729 | 9732 |
| 9730 void GLES2DecoderImpl::LoseContext(uint32 reset_status) { | 9733 void GLES2DecoderImpl::LoseContext(uint32 reset_status) { |
| 9731 // Only loses the context once. | 9734 // Only loses the context once. |
| 9732 if (reset_status_ != GL_NO_ERROR) { | 9735 if (reset_status_ != GL_NO_ERROR) { |
| 9733 return; | 9736 return; |
| 9734 } | 9737 } |
| 9735 | 9738 |
| 9739 if (workarounds().use_virtualized_gl_contexts) { |
| 9740 // If the context is virtual, the real context being guilty does not ensure |
| 9741 // that the virtual context is guilty. |
| 9742 if (reset_status == GL_GUILTY_CONTEXT_RESET_ARB) { |
| 9743 reset_status = GL_UNKNOWN_CONTEXT_RESET_ARB; |
| 9744 } |
| 9745 } else if (reset_status == GL_UNKNOWN_CONTEXT_RESET_ARB && |
| 9746 has_robustness_extension_) { |
| 9747 // If the reason for the call was a GL error, we can try to determine the |
| 9748 // reset status more accurately. |
| 9749 GLenum driver_status = glGetGraphicsResetStatusARB(); |
| 9750 if (driver_status == GL_GUILTY_CONTEXT_RESET_ARB || |
| 9751 driver_status == GL_INNOCENT_CONTEXT_RESET_ARB) { |
| 9752 reset_status = driver_status; |
| 9753 } |
| 9754 } |
| 9755 |
| 9736 // Marks this context as lost. | 9756 // Marks this context as lost. |
| 9737 reset_status_ = reset_status; | 9757 reset_status_ = reset_status; |
| 9738 current_decoder_error_ = error::kLostContext; | 9758 current_decoder_error_ = error::kLostContext; |
| 9739 } | 9759 } |
| 9740 | 9760 |
| 9741 error::Error GLES2DecoderImpl::HandleInsertSyncPointCHROMIUM( | 9761 error::Error GLES2DecoderImpl::HandleInsertSyncPointCHROMIUM( |
| 9742 uint32 immediate_data_size, | 9762 uint32 immediate_data_size, |
| 9743 const void* cmd_data) { | 9763 const void* cmd_data) { |
| 9744 return error::kUnknownCommand; | 9764 return error::kUnknownCommand; |
| 9745 } | 9765 } |
| (...skipping 1471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11217 ProcessFinishedAsyncTransfers(); | 11237 ProcessFinishedAsyncTransfers(); |
| 11218 return error::kNoError; | 11238 return error::kNoError; |
| 11219 } | 11239 } |
| 11220 | 11240 |
| 11221 void GLES2DecoderImpl::OnTextureRefDetachedFromFramebuffer( | 11241 void GLES2DecoderImpl::OnTextureRefDetachedFromFramebuffer( |
| 11222 TextureRef* texture_ref) { | 11242 TextureRef* texture_ref) { |
| 11223 Texture* texture = texture_ref->texture(); | 11243 Texture* texture = texture_ref->texture(); |
| 11224 DoDidUseTexImageIfNeeded(texture, texture->target()); | 11244 DoDidUseTexImageIfNeeded(texture, texture->target()); |
| 11225 } | 11245 } |
| 11226 | 11246 |
| 11247 void GLES2DecoderImpl::OnContextLostError() { |
| 11248 group_->LoseContexts(GL_UNKNOWN_CONTEXT_RESET_ARB); |
| 11249 } |
| 11250 |
| 11227 void GLES2DecoderImpl::OnOutOfMemoryError() { | 11251 void GLES2DecoderImpl::OnOutOfMemoryError() { |
| 11228 if (lose_context_when_out_of_memory_) { | 11252 if (lose_context_when_out_of_memory_) { |
| 11229 group_->LoseContexts(GL_UNKNOWN_CONTEXT_RESET_ARB); | 11253 group_->LoseContexts(GL_UNKNOWN_CONTEXT_RESET_ARB); |
| 11230 LoseContext(GL_GUILTY_CONTEXT_RESET_ARB); | |
| 11231 } | 11254 } |
| 11232 } | 11255 } |
| 11233 | 11256 |
| 11234 // Include the auto-generated part of this file. We split this because it means | 11257 // Include the auto-generated part of this file. We split this because it means |
| 11235 // we can easily edit the non-auto generated parts right here in this file | 11258 // we can easily edit the non-auto generated parts right here in this file |
| 11236 // instead of having to edit some template or the code generator. | 11259 // instead of having to edit some template or the code generator. |
| 11237 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 11260 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 11238 | 11261 |
| 11239 } // namespace gles2 | 11262 } // namespace gles2 |
| 11240 } // namespace gpu | 11263 } // namespace gpu |
| OLD | NEW |