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 20 matching lines...) Expand all Loading... |
31 #include "gpu/command_buffer/common/id_allocator.h" | 31 #include "gpu/command_buffer/common/id_allocator.h" |
32 #include "gpu/command_buffer/service/buffer_manager.h" | 32 #include "gpu/command_buffer/service/buffer_manager.h" |
33 #include "gpu/command_buffer/service/cmd_buffer_engine.h" | 33 #include "gpu/command_buffer/service/cmd_buffer_engine.h" |
34 #include "gpu/command_buffer/service/context_group.h" | 34 #include "gpu/command_buffer/service/context_group.h" |
35 #include "gpu/command_buffer/service/feature_info.h" | 35 #include "gpu/command_buffer/service/feature_info.h" |
36 #include "gpu/command_buffer/service/framebuffer_manager.h" | 36 #include "gpu/command_buffer/service/framebuffer_manager.h" |
37 #include "gpu/command_buffer/service/gl_utils.h" | 37 #include "gpu/command_buffer/service/gl_utils.h" |
38 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" | 38 #include "gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.h" |
39 #include "gpu/command_buffer/service/gles2_cmd_validation.h" | 39 #include "gpu/command_buffer/service/gles2_cmd_validation.h" |
40 #include "gpu/command_buffer/service/gpu_switches.h" | 40 #include "gpu/command_buffer/service/gpu_switches.h" |
| 41 #include "gpu/command_buffer/service/image_manager.h" |
41 #include "gpu/command_buffer/service/mailbox_manager.h" | 42 #include "gpu/command_buffer/service/mailbox_manager.h" |
42 #include "gpu/command_buffer/service/memory_tracking.h" | 43 #include "gpu/command_buffer/service/memory_tracking.h" |
43 #include "gpu/command_buffer/service/program_manager.h" | 44 #include "gpu/command_buffer/service/program_manager.h" |
44 #include "gpu/command_buffer/service/query_manager.h" | 45 #include "gpu/command_buffer/service/query_manager.h" |
45 #include "gpu/command_buffer/service/renderbuffer_manager.h" | 46 #include "gpu/command_buffer/service/renderbuffer_manager.h" |
46 #include "gpu/command_buffer/service/shader_manager.h" | 47 #include "gpu/command_buffer/service/shader_manager.h" |
47 #include "gpu/command_buffer/service/shader_translator.h" | 48 #include "gpu/command_buffer/service/shader_translator.h" |
48 #include "gpu/command_buffer/service/shader_translator_cache.h" | 49 #include "gpu/command_buffer/service/shader_translator_cache.h" |
49 #include "gpu/command_buffer/service/stream_texture.h" | 50 #include "gpu/command_buffer/service/stream_texture.h" |
50 #include "gpu/command_buffer/service/stream_texture_manager.h" | 51 #include "gpu/command_buffer/service/stream_texture_manager.h" |
51 #include "gpu/command_buffer/service/texture_definition.h" | 52 #include "gpu/command_buffer/service/texture_definition.h" |
52 #include "gpu/command_buffer/service/texture_manager.h" | 53 #include "gpu/command_buffer/service/texture_manager.h" |
53 #include "gpu/command_buffer/service/vertex_attrib_manager.h" | 54 #include "gpu/command_buffer/service/vertex_attrib_manager.h" |
54 #include "gpu/command_buffer/service/vertex_array_manager.h" | 55 #include "gpu/command_buffer/service/vertex_array_manager.h" |
55 #include "ui/gl/gl_context.h" | 56 #include "ui/gl/gl_context.h" |
| 57 #include "ui/gl/gl_image.h" |
56 #include "ui/gl/gl_implementation.h" | 58 #include "ui/gl/gl_implementation.h" |
57 #include "ui/gl/gl_surface.h" | 59 #include "ui/gl/gl_surface.h" |
58 #if defined(OS_MACOSX) | 60 #if defined(OS_MACOSX) |
59 #include "ui/surface/io_surface_support_mac.h" | 61 #include "ui/surface/io_surface_support_mac.h" |
60 #endif | 62 #endif |
61 | 63 |
62 #if !defined(GL_DEPTH24_STENCIL8) | 64 #if !defined(GL_DEPTH24_STENCIL8) |
63 #define GL_DEPTH24_STENCIL8 0x88F0 | 65 #define GL_DEPTH24_STENCIL8 0x88F0 |
64 #endif | 66 #endif |
65 | 67 |
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 } | 663 } |
662 | 664 |
663 TextureManager* texture_manager() { | 665 TextureManager* texture_manager() { |
664 return group_->texture_manager(); | 666 return group_->texture_manager(); |
665 } | 667 } |
666 | 668 |
667 MailboxManager* mailbox_manager() { | 669 MailboxManager* mailbox_manager() { |
668 return group_->mailbox_manager(); | 670 return group_->mailbox_manager(); |
669 } | 671 } |
670 | 672 |
| 673 ImageManager* image_manager() { |
| 674 return group_->image_manager(); |
| 675 } |
| 676 |
671 VertexArrayManager* vertex_array_manager() { | 677 VertexArrayManager* vertex_array_manager() { |
672 return vertex_array_manager_.get(); | 678 return vertex_array_manager_.get(); |
673 } | 679 } |
674 | 680 |
675 bool IsOffscreenBufferMultisampled() const { | 681 bool IsOffscreenBufferMultisampled() const { |
676 return offscreen_target_samples_ > 1; | 682 return offscreen_target_samples_ > 1; |
677 } | 683 } |
678 | 684 |
679 // Creates a TextureInfo for the given texture. | 685 // Creates a TextureInfo for the given texture. |
680 TextureManager::TextureInfo* CreateTextureInfo( | 686 TextureManager::TextureInfo* CreateTextureInfo( |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
792 void DoTexStorage2DEXT( | 798 void DoTexStorage2DEXT( |
793 GLenum target, | 799 GLenum target, |
794 GLint levels, | 800 GLint levels, |
795 GLenum internal_format, | 801 GLenum internal_format, |
796 GLsizei width, | 802 GLsizei width, |
797 GLsizei height); | 803 GLsizei height); |
798 | 804 |
799 void DoProduceTextureCHROMIUM(GLenum target, const GLbyte* key); | 805 void DoProduceTextureCHROMIUM(GLenum target, const GLbyte* key); |
800 void DoConsumeTextureCHROMIUM(GLenum target, const GLbyte* key); | 806 void DoConsumeTextureCHROMIUM(GLenum target, const GLbyte* key); |
801 | 807 |
| 808 void DoBindTexImage2DCHROMIUM( |
| 809 GLenum target, |
| 810 GLint image_id); |
| 811 void DoReleaseTexImage2DCHROMIUM( |
| 812 GLenum target, |
| 813 GLint image_id); |
| 814 |
802 // Creates a ProgramInfo for the given program. | 815 // Creates a ProgramInfo for the given program. |
803 ProgramManager::ProgramInfo* CreateProgramInfo( | 816 ProgramManager::ProgramInfo* CreateProgramInfo( |
804 GLuint client_id, GLuint service_id) { | 817 GLuint client_id, GLuint service_id) { |
805 return program_manager()->CreateProgramInfo(client_id, service_id); | 818 return program_manager()->CreateProgramInfo(client_id, service_id); |
806 } | 819 } |
807 | 820 |
808 // Gets the program info for the given program. Returns NULL if none exists. | 821 // Gets the program info for the given program. Returns NULL if none exists. |
809 ProgramManager::ProgramInfo* GetProgramInfo(GLuint client_id) { | 822 ProgramManager::ProgramInfo* GetProgramInfo(GLuint client_id) { |
810 return program_manager()->GetProgramInfo(client_id); | 823 return program_manager()->GetProgramInfo(client_id); |
811 } | 824 } |
(...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1312 case GL_TEXTURE_RECTANGLE_ARB: | 1325 case GL_TEXTURE_RECTANGLE_ARB: |
1313 info = unit.bound_texture_rectangle_arb; | 1326 info = unit.bound_texture_rectangle_arb; |
1314 break; | 1327 break; |
1315 default: | 1328 default: |
1316 NOTREACHED(); | 1329 NOTREACHED(); |
1317 return NULL; | 1330 return NULL; |
1318 } | 1331 } |
1319 return info; | 1332 return info; |
1320 } | 1333 } |
1321 | 1334 |
| 1335 TextureManager::TextureInfo* GetTextureInfoForTargetUnlessDefault( |
| 1336 GLenum target) { |
| 1337 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); |
| 1338 if (!info) |
| 1339 return NULL; |
| 1340 if (info == texture_manager()->GetDefaultTextureInfo(target)) |
| 1341 return NULL; |
| 1342 return info; |
| 1343 } |
| 1344 |
1322 GLenum GetBindTargetForSamplerType(GLenum type) { | 1345 GLenum GetBindTargetForSamplerType(GLenum type) { |
1323 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || | 1346 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || |
1324 type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_2D_RECT_ARB); | 1347 type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_2D_RECT_ARB); |
1325 switch (type) { | 1348 switch (type) { |
1326 case GL_SAMPLER_2D: | 1349 case GL_SAMPLER_2D: |
1327 return GL_TEXTURE_2D; | 1350 return GL_TEXTURE_2D; |
1328 case GL_SAMPLER_CUBE: | 1351 case GL_SAMPLER_CUBE: |
1329 return GL_TEXTURE_CUBE_MAP; | 1352 return GL_TEXTURE_CUBE_MAP; |
1330 case GL_SAMPLER_EXTERNAL_OES: | 1353 case GL_SAMPLER_EXTERNAL_OES: |
1331 return GL_TEXTURE_EXTERNAL_OES; | 1354 return GL_TEXTURE_EXTERNAL_OES; |
(...skipping 7685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9017 // support for binding an IOSurface to a NPOT TEXTURE_2D texture, we | 9040 // support for binding an IOSurface to a NPOT TEXTURE_2D texture, we |
9018 // could delete a lot of code. For now, perform strict validation so we | 9041 // could delete a lot of code. For now, perform strict validation so we |
9019 // know what's going on. | 9042 // know what's going on. |
9020 SetGLError( | 9043 SetGLError( |
9021 GL_INVALID_OPERATION, | 9044 GL_INVALID_OPERATION, |
9022 "glTexImageIOSurface2DCHROMIUM", | 9045 "glTexImageIOSurface2DCHROMIUM", |
9023 "requires TEXTURE_RECTANGLE_ARB target"); | 9046 "requires TEXTURE_RECTANGLE_ARB target"); |
9024 return; | 9047 return; |
9025 } | 9048 } |
9026 | 9049 |
9027 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target); | 9050 // Default target might be conceptually valid, but disallow it to avoid |
| 9051 // accidents. |
| 9052 TextureManager::TextureInfo* info = GetTextureInfoForTargetUnlessDefault( |
| 9053 target); |
9028 if (!info) { | 9054 if (!info) { |
9029 SetGLError(GL_INVALID_OPERATION, | 9055 SetGLError(GL_INVALID_OPERATION, |
9030 "glTexImageIOSurface2DCHROMIUM", "no rectangle texture bound"); | 9056 "glTexImageIOSurface2DCHROMIUM", "no rectangle texture bound"); |
9031 return; | 9057 return; |
9032 } | 9058 } |
9033 if (info == texture_manager()->GetDefaultTextureInfo(target)) { | |
9034 // Maybe this is conceptually valid, but disallow it to avoid accidents. | |
9035 SetGLError(GL_INVALID_OPERATION, | |
9036 "glTexImageIOSurface2DCHROMIUM", "can't bind default texture"); | |
9037 return; | |
9038 } | |
9039 | 9059 |
9040 // Look up the new IOSurface. Note that because of asynchrony | 9060 // Look up the new IOSurface. Note that because of asynchrony |
9041 // between processes this might fail; during live resizing the | 9061 // between processes this might fail; during live resizing the |
9042 // plugin process might allocate and release an IOSurface before | 9062 // plugin process might allocate and release an IOSurface before |
9043 // this process gets a chance to look it up. Hold on to any old | 9063 // this process gets a chance to look it up. Hold on to any old |
9044 // IOSurface in this case. | 9064 // IOSurface in this case. |
9045 CFTypeRef surface = surface_support->IOSurfaceLookup(io_surface_id); | 9065 CFTypeRef surface = surface_support->IOSurfaceLookup(io_surface_id); |
9046 if (!surface) { | 9066 if (!surface) { |
9047 SetGLError( | 9067 SetGLError( |
9048 GL_INVALID_OPERATION, | 9068 GL_INVALID_OPERATION, |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9426 marker = ""; | 9446 marker = ""; |
9427 } | 9447 } |
9428 debug_marker_manager_.PushGroup( | 9448 debug_marker_manager_.PushGroup( |
9429 length ? std::string(marker, length) : std::string(marker)); | 9449 length ? std::string(marker, length) : std::string(marker)); |
9430 } | 9450 } |
9431 | 9451 |
9432 void GLES2DecoderImpl::DoPopGroupMarkerEXT(void) { | 9452 void GLES2DecoderImpl::DoPopGroupMarkerEXT(void) { |
9433 debug_marker_manager_.PopGroup(); | 9453 debug_marker_manager_.PopGroup(); |
9434 } | 9454 } |
9435 | 9455 |
| 9456 void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM( |
| 9457 GLenum target, GLint image_id) { |
| 9458 if (target != GL_TEXTURE_2D) { |
| 9459 // This might be supported in the future. |
| 9460 SetGLError( |
| 9461 GL_INVALID_OPERATION, |
| 9462 "glBindTexImage2DCHROMIUM", "requires TEXTURE_2D target"); |
| 9463 return; |
| 9464 } |
| 9465 |
| 9466 // Default target might be conceptually valid, but disallow it to avoid |
| 9467 // accidents. |
| 9468 TextureManager::TextureInfo* info = GetTextureInfoForTargetUnlessDefault( |
| 9469 target); |
| 9470 if (!info) { |
| 9471 SetGLError(GL_INVALID_OPERATION, |
| 9472 "glBindTexImage2DCHROMIUM", "no texture bound"); |
| 9473 return; |
| 9474 } |
| 9475 |
| 9476 scoped_refptr<gfx::GLImage> gl_image = |
| 9477 image_manager()->LookupImage(image_id); |
| 9478 if (!gl_image) { |
| 9479 SetGLError(GL_INVALID_OPERATION, |
| 9480 "glBindTexImage2DCHROMIUM", |
| 9481 "no image found with the given ID"); |
| 9482 return; |
| 9483 } |
| 9484 |
| 9485 if (!gl_image->BindTexImage()) { |
| 9486 SetGLError(GL_INVALID_OPERATION, |
| 9487 "glBindTexImage2DCHROMIUM", |
| 9488 "fail to bind image with the given ID"); |
| 9489 return; |
| 9490 } |
| 9491 |
| 9492 gfx::Size size = gl_image->GetSize(); |
| 9493 texture_manager()->SetLevelInfo( |
| 9494 info, target, 0, GL_RGBA, size.width(), size.height(), 1, 0, |
| 9495 GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, true); |
| 9496 texture_manager()->SetLevelImage(info, target, 0, gl_image); |
| 9497 } |
| 9498 |
| 9499 void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM( |
| 9500 GLenum target, GLint image_id) { |
| 9501 if (target != GL_TEXTURE_2D) { |
| 9502 // This might be supported in the future. |
| 9503 SetGLError( |
| 9504 GL_INVALID_OPERATION, |
| 9505 "glReleaseTexImage2DCHROMIUM", "requires TEXTURE_2D target"); |
| 9506 return; |
| 9507 } |
| 9508 |
| 9509 // Default target might be conceptually valid, but disallow it to avoid |
| 9510 // accidents. |
| 9511 TextureManager::TextureInfo* info = GetTextureInfoForTargetUnlessDefault( |
| 9512 target); |
| 9513 if (!info) { |
| 9514 SetGLError(GL_INVALID_OPERATION, |
| 9515 "glReleaseTexImage2DCHROMIUM", "no texture bound"); |
| 9516 return; |
| 9517 } |
| 9518 |
| 9519 scoped_refptr<gfx::GLImage> gl_image = |
| 9520 image_manager()->LookupImage(image_id); |
| 9521 if (!gl_image) { |
| 9522 SetGLError(GL_INVALID_OPERATION, |
| 9523 "glReleaseTexImage2DCHROMIUM", |
| 9524 "no image found with the given ID"); |
| 9525 return; |
| 9526 } |
| 9527 |
| 9528 // Do nothing when image is not currently bound. |
| 9529 if (info->GetLevelImage(target, 0) != gl_image) |
| 9530 return; |
| 9531 |
| 9532 gl_image->ReleaseTexImage(); |
| 9533 |
| 9534 texture_manager()->SetLevelInfo( |
| 9535 info, target, 0, GL_RGBA, 0, 0, 1, 0, |
| 9536 GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, false); |
| 9537 } |
9436 | 9538 |
9437 // Include the auto-generated part of this file. We split this because it means | 9539 // Include the auto-generated part of this file. We split this because it means |
9438 // we can easily edit the non-auto generated parts right here in this file | 9540 // we can easily edit the non-auto generated parts right here in this file |
9439 // instead of having to edit some template or the code generator. | 9541 // instead of having to edit some template or the code generator. |
9440 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 9542 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
9441 | 9543 |
9442 } // namespace gles2 | 9544 } // namespace gles2 |
9443 } // namespace gpu | 9545 } // namespace gpu |
OLD | NEW |