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> |
11 #include <map> | 11 #include <map> |
12 #include <string> | 12 #include <string> |
13 #include <vector> | 13 #include <vector> |
14 | 14 |
15 #include "base/atomicops.h" | 15 #include "base/atomicops.h" |
16 #include "base/at_exit.h" | 16 #include "base/at_exit.h" |
17 #include "base/bind.h" | 17 #include "base/bind.h" |
18 #include "base/command_line.h" | 18 #include "base/command_line.h" |
19 #include "base/debug/trace_event.h" | 19 #include "base/debug/trace_event.h" |
20 #if defined(OS_MACOSX) | 20 #if defined(OS_MACOSX) |
21 #include "base/mac/scoped_cftyperef.h" | 21 #include "base/mac/scoped_cftyperef.h" |
22 #endif | 22 #endif |
23 #include "base/memory/scoped_ptr.h" | 23 #include "base/memory/scoped_ptr.h" |
24 #include "base/memory/weak_ptr.h" | 24 #include "base/memory/weak_ptr.h" |
25 #include "build/build_config.h" | 25 #include "build/build_config.h" |
26 #include "crypto/symmetric_key.h" | |
26 #define GLES2_GPU_SERVICE 1 | 27 #define GLES2_GPU_SERVICE 1 |
27 #include "gpu/command_buffer/common/gles2_cmd_format.h" | 28 #include "gpu/command_buffer/common/gles2_cmd_format.h" |
28 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 29 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
29 #include "gpu/command_buffer/common/id_allocator.h" | 30 #include "gpu/command_buffer/common/id_allocator.h" |
30 #include "gpu/command_buffer/service/buffer_manager.h" | 31 #include "gpu/command_buffer/service/buffer_manager.h" |
31 #include "gpu/command_buffer/service/cmd_buffer_engine.h" | 32 #include "gpu/command_buffer/service/cmd_buffer_engine.h" |
32 #include "gpu/command_buffer/service/context_group.h" | 33 #include "gpu/command_buffer/service/context_group.h" |
33 #include "gpu/command_buffer/service/feature_info.h" | 34 #include "gpu/command_buffer/service/feature_info.h" |
34 #include "gpu/command_buffer/service/framebuffer_manager.h" | 35 #include "gpu/command_buffer/service/framebuffer_manager.h" |
35 #include "gpu/command_buffer/service/gl_utils.h" | 36 #include "gpu/command_buffer/service/gl_utils.h" |
36 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" | 37 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" |
37 #include "gpu/command_buffer/service/gles2_cmd_validation.h" | 38 #include "gpu/command_buffer/service/gles2_cmd_validation.h" |
38 #include "gpu/command_buffer/service/gpu_switches.h" | 39 #include "gpu/command_buffer/service/gpu_switches.h" |
40 #include "gpu/command_buffer/service/mailbox_manager.h" | |
39 #include "gpu/command_buffer/service/program_manager.h" | 41 #include "gpu/command_buffer/service/program_manager.h" |
40 #include "gpu/command_buffer/service/query_manager.h" | 42 #include "gpu/command_buffer/service/query_manager.h" |
41 #include "gpu/command_buffer/service/renderbuffer_manager.h" | 43 #include "gpu/command_buffer/service/renderbuffer_manager.h" |
42 #include "gpu/command_buffer/service/shader_manager.h" | 44 #include "gpu/command_buffer/service/shader_manager.h" |
43 #include "gpu/command_buffer/service/shader_translator.h" | 45 #include "gpu/command_buffer/service/shader_translator.h" |
44 #include "gpu/command_buffer/service/stream_texture.h" | 46 #include "gpu/command_buffer/service/stream_texture.h" |
45 #include "gpu/command_buffer/service/stream_texture_manager.h" | 47 #include "gpu/command_buffer/service/stream_texture_manager.h" |
48 #include "gpu/command_buffer/service/texture_definition.h" | |
46 #include "gpu/command_buffer/service/texture_manager.h" | 49 #include "gpu/command_buffer/service/texture_manager.h" |
47 #include "gpu/command_buffer/service/vertex_attrib_manager.h" | 50 #include "gpu/command_buffer/service/vertex_attrib_manager.h" |
48 #include "ui/gfx/gl/gl_context.h" | 51 #include "ui/gfx/gl/gl_context.h" |
49 #include "ui/gfx/gl/gl_implementation.h" | 52 #include "ui/gfx/gl/gl_implementation.h" |
50 #include "ui/gfx/gl/gl_surface.h" | 53 #include "ui/gfx/gl/gl_surface.h" |
51 #if defined(OS_MACOSX) | 54 #if defined(OS_MACOSX) |
52 #include "ui/gfx/surface/io_surface_support_mac.h" | 55 #include "ui/gfx/surface/io_surface_support_mac.h" |
53 #endif | 56 #endif |
54 | 57 |
55 #if !defined(GL_DEPTH24_STENCIL8) | 58 #if !defined(GL_DEPTH24_STENCIL8) |
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
501 uint32* service_texture_id); | 504 uint32* service_texture_id); |
502 | 505 |
503 // Restores the current state to the user's settings. | 506 // Restores the current state to the user's settings. |
504 void RestoreCurrentFramebufferBindings(); | 507 void RestoreCurrentFramebufferBindings(); |
505 void RestoreCurrentRenderbufferBindings(); | 508 void RestoreCurrentRenderbufferBindings(); |
506 void RestoreCurrentTexture2DBindings(); | 509 void RestoreCurrentTexture2DBindings(); |
507 | 510 |
508 // Sets DEPTH_TEST, STENCIL_TEST and color mask for the current framebuffer. | 511 // Sets DEPTH_TEST, STENCIL_TEST and color mask for the current framebuffer. |
509 void ApplyDirtyState(); | 512 void ApplyDirtyState(); |
510 | 513 |
514 // Reapply the texture parameters to the given texture. | |
515 void BindAndApplyTextureParameters(TextureManager::TextureInfo* info); | |
516 | |
511 // These check the state of the currently bound framebuffer or the | 517 // These check the state of the currently bound framebuffer or the |
512 // backbuffer if no framebuffer is bound. | 518 // backbuffer if no framebuffer is bound. |
513 bool BoundFramebufferHasColorAttachmentWithAlpha(); | 519 bool BoundFramebufferHasColorAttachmentWithAlpha(); |
514 bool BoundFramebufferHasDepthAttachment(); | 520 bool BoundFramebufferHasDepthAttachment(); |
515 bool BoundFramebufferHasStencilAttachment(); | 521 bool BoundFramebufferHasStencilAttachment(); |
516 | 522 |
517 virtual error::ContextLostReason GetContextLostReason(); | 523 virtual error::ContextLostReason GetContextLostReason(); |
518 | 524 |
519 private: | 525 private: |
520 friend class ScopedGLErrorSuppressor; | 526 friend class ScopedGLErrorSuppressor; |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
734 GLint level); | 740 GLint level); |
735 | 741 |
736 // Wrapper for TexStorage2DEXT. | 742 // Wrapper for TexStorage2DEXT. |
737 void DoTexStorage2DEXT( | 743 void DoTexStorage2DEXT( |
738 GLenum target, | 744 GLenum target, |
739 GLint levels, | 745 GLint levels, |
740 GLenum internal_format, | 746 GLenum internal_format, |
741 GLsizei width, | 747 GLsizei width, |
742 GLsizei height); | 748 GLsizei height); |
743 | 749 |
750 // Wrapper for SwapTexturesCHROMIUM. | |
Ken Russell (switch to Gerrit)
2012/04/26 01:10:53
Wrong comment.
| |
751 void DoProduceTextureCHROMIUM(GLenum target, const char* key); | |
752 | |
753 // Wrapper for TexKeyCHROMIUM. | |
Ken Russell (switch to Gerrit)
2012/04/26 01:10:53
Wrong comment.
| |
754 void DoConsumeTextureCHROMIUM(GLenum target, const char* key); | |
755 | |
744 // Creates a ProgramInfo for the given program. | 756 // Creates a ProgramInfo for the given program. |
745 ProgramManager::ProgramInfo* CreateProgramInfo( | 757 ProgramManager::ProgramInfo* CreateProgramInfo( |
746 GLuint client_id, GLuint service_id) { | 758 GLuint client_id, GLuint service_id) { |
747 return program_manager()->CreateProgramInfo(client_id, service_id); | 759 return program_manager()->CreateProgramInfo(client_id, service_id); |
748 } | 760 } |
749 | 761 |
750 // Gets the program info for the given program. Returns NULL if none exists. | 762 // Gets the program info for the given program. Returns NULL if none exists. |
751 ProgramManager::ProgramInfo* GetProgramInfo(GLuint client_id) { | 763 ProgramManager::ProgramInfo* GetProgramInfo(GLuint client_id) { |
752 return program_manager()->GetProgramInfo(client_id); | 764 return program_manager()->GetProgramInfo(client_id); |
753 } | 765 } |
(...skipping 2502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3256 bool have_stencil = BoundFramebufferHasStencilAttachment(); | 3268 bool have_stencil = BoundFramebufferHasStencilAttachment(); |
3257 glStencilMaskSeparate(GL_FRONT, have_stencil ? mask_stencil_front_ : 0); | 3269 glStencilMaskSeparate(GL_FRONT, have_stencil ? mask_stencil_front_ : 0); |
3258 glStencilMaskSeparate(GL_BACK, have_stencil ? mask_stencil_back_ : 0); | 3270 glStencilMaskSeparate(GL_BACK, have_stencil ? mask_stencil_back_ : 0); |
3259 EnableDisable(GL_STENCIL_TEST, enable_stencil_test_ && have_stencil); | 3271 EnableDisable(GL_STENCIL_TEST, enable_stencil_test_ && have_stencil); |
3260 EnableDisable(GL_CULL_FACE, enable_cull_face_); | 3272 EnableDisable(GL_CULL_FACE, enable_cull_face_); |
3261 EnableDisable(GL_SCISSOR_TEST, enable_scissor_test_); | 3273 EnableDisable(GL_SCISSOR_TEST, enable_scissor_test_); |
3262 state_dirty_ = false; | 3274 state_dirty_ = false; |
3263 } | 3275 } |
3264 } | 3276 } |
3265 | 3277 |
3278 void GLES2DecoderImpl::BindAndApplyTextureParameters( | |
3279 TextureManager::TextureInfo* info) { | |
3280 glBindTexture(info->target(), info->service_id()); | |
3281 glTexParameteri(info->target(), GL_TEXTURE_MIN_FILTER, info->min_filter()); | |
3282 glTexParameteri(info->target(), GL_TEXTURE_MAG_FILTER, info->mag_filter()); | |
3283 glTexParameteri(info->target(), GL_TEXTURE_WRAP_S, info->wrap_s()); | |
3284 glTexParameteri(info->target(), GL_TEXTURE_WRAP_T, info->wrap_t()); | |
3285 } | |
3286 | |
3266 GLuint GLES2DecoderImpl::GetBackbufferServiceId() { | 3287 GLuint GLES2DecoderImpl::GetBackbufferServiceId() { |
3267 return (offscreen_target_frame_buffer_.get()) ? | 3288 return (offscreen_target_frame_buffer_.get()) ? |
3268 offscreen_target_frame_buffer_->id() : | 3289 offscreen_target_frame_buffer_->id() : |
3269 surface_->GetBackingFrameBufferObject(); | 3290 surface_->GetBackingFrameBufferObject(); |
3270 } | 3291 } |
3271 | 3292 |
3272 void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) { | 3293 void GLES2DecoderImpl::DoBindFramebuffer(GLenum target, GLuint client_id) { |
3273 FramebufferManager::FramebufferInfo* info = NULL; | 3294 FramebufferManager::FramebufferInfo* info = NULL; |
3274 GLuint service_id = 0; | 3295 GLuint service_id = 0; |
3275 if (client_id != 0) { | 3296 if (client_id != 0) { |
(...skipping 5219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8495 texture_manager()->SetLevelInfo( | 8516 texture_manager()->SetLevelInfo( |
8496 info, target, 0, format, level_width, level_height, 1, 0, format, | 8517 info, target, 0, format, level_width, level_height, 1, 0, format, |
8497 type, false); | 8518 type, false); |
8498 level_width = std::max(1, level_width >> 1); | 8519 level_width = std::max(1, level_width >> 1); |
8499 level_height = std::max(1, level_height >> 1); | 8520 level_height = std::max(1, level_height >> 1); |
8500 } | 8521 } |
8501 info->SetImmutable(true); | 8522 info->SetImmutable(true); |
8502 } | 8523 } |
8503 } | 8524 } |
8504 | 8525 |
8526 error::Error GLES2DecoderImpl::HandleGenMailboxCHROMIUM( | |
8527 uint32 immediate_data_size, const gles2::GenMailboxCHROMIUM& c) { | |
8528 uint32 bucket_id = static_cast<uint32>(c.bucket_id); | |
8529 Bucket* bucket = CreateBucket(bucket_id); | |
8530 crypto::SymmetricKey* key = | |
8531 crypto::SymmetricKey::GenerateRandomKey(crypto::SymmetricKey::AES, | |
8532 kMailboxSize * 8); | |
8533 std::string mailbox; | |
8534 if (!key->GetRawKey(&mailbox)) { | |
8535 SetGLError(GL_OUT_OF_MEMORY, | |
8536 "glHandleGenMailboxCHROMIUM: failed to generate mailbox"); | |
8537 return error::kNoError; | |
8538 } | |
8539 | |
8540 DCHECK(mailbox.length() == kMailboxSize); | |
8541 | |
8542 bucket->SetSize(kMailboxSize); | |
8543 bucket->SetData(&mailbox[0], 0, kMailboxSize); | |
8544 | |
8545 return error::kNoError; | |
8546 } | |
8547 | |
8548 void GLES2DecoderImpl::DoProduceTextureCHROMIUM(GLenum target, | |
8549 const char* mailbox) { | |
8550 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | |
8551 if (!info) { | |
8552 SetGLError(GL_INVALID_OPERATION, | |
8553 "glProduceTextureCHROMIUM: unknown texture for target"); | |
8554 return; | |
8555 } | |
8556 | |
8557 TextureDefinition* definition = texture_manager()->Save(info); | |
8558 if (!definition) { | |
8559 SetGLError(GL_INVALID_OPERATION, | |
8560 "glProduceTextureCHROMIUM: invalid texture"); | |
8561 return; | |
8562 } | |
8563 | |
8564 group_->mailbox_manager()->ProduceTexture( | |
greggman
2012/04/26 18:09:18
I'm a little concerned that GenMailbox is optional
| |
8565 target, | |
8566 *reinterpret_cast<const MailboxName*>(mailbox), | |
8567 definition, | |
8568 texture_manager()); | |
8569 | |
8570 BindAndApplyTextureParameters(info); | |
8571 } | |
8572 | |
8573 void GLES2DecoderImpl::DoConsumeTextureCHROMIUM(GLenum target, | |
8574 const char* mailbox) { | |
8575 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | |
8576 if (!info) { | |
8577 SetGLError(GL_INVALID_OPERATION, | |
8578 "glConsumeTextureCHROMIUM: unknown texture for target"); | |
8579 return; | |
8580 } | |
8581 | |
8582 scoped_ptr<TextureDefinition> definition( | |
8583 group_->mailbox_manager()->ConsumeTexture( | |
8584 target, | |
8585 *reinterpret_cast<const MailboxName*>(mailbox))); | |
8586 if (!definition.get()) { | |
8587 SetGLError(GL_INVALID_OPERATION, | |
8588 "glConsumeTextureCHROMIUM: empty mailbox"); | |
8589 return; | |
8590 } | |
8591 | |
8592 if (!texture_manager()->Restore(info, definition.release())) { | |
8593 SetGLError(GL_INVALID_OPERATION, | |
8594 "glConsumeTextureCHROMIUM: invalid texture"); | |
8595 return; | |
8596 } | |
8597 | |
8598 BindAndApplyTextureParameters(info); | |
8599 } | |
8600 | |
8505 // Include the auto-generated part of this file. We split this because it means | 8601 // Include the auto-generated part of this file. We split this because it means |
8506 // we can easily edit the non-auto generated parts right here in this file | 8602 // we can easily edit the non-auto generated parts right here in this file |
8507 // instead of having to edit some template or the code generator. | 8603 // instead of having to edit some template or the code generator. |
8508 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 8604 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
8509 | 8605 |
8510 } // namespace gles2 | 8606 } // namespace gles2 |
8511 } // namespace gpu | 8607 } // namespace gpu |
OLD | NEW |