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 // A class to emulate GLES2 over command buffers. | 5 // A class to emulate GLES2 over command buffers. |
6 | 6 |
7 #include "gpu/command_buffer/client/gles2_implementation.h" | 7 #include "gpu/command_buffer/client/gles2_implementation.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <map> | 10 #include <map> |
11 #include <queue> | 11 #include <queue> |
12 #include <set> | 12 #include <set> |
13 #include <limits> | 13 #include <limits> |
14 #include <stdio.h> | 14 #include <stdio.h> |
15 #include <string.h> | 15 #include <string.h> |
16 #include <GLES2/gl2ext.h> | 16 #include <GLES2/gl2ext.h> |
17 #include <GLES2/gl2extchromium.h> | 17 #include <GLES2/gl2extchromium.h> |
18 #include "gpu/command_buffer/client/buffer_tracker.h" | 18 #include "gpu/command_buffer/client/buffer_tracker.h" |
19 #include "gpu/command_buffer/client/gpu_memory_buffer.h" | |
20 #include "gpu/command_buffer/client/gpu_memory_buffer_tracker.h" | 19 #include "gpu/command_buffer/client/gpu_memory_buffer_tracker.h" |
21 #include "gpu/command_buffer/client/mapped_memory.h" | 20 #include "gpu/command_buffer/client/mapped_memory.h" |
22 #include "gpu/command_buffer/client/program_info_manager.h" | 21 #include "gpu/command_buffer/client/program_info_manager.h" |
23 #include "gpu/command_buffer/client/query_tracker.h" | 22 #include "gpu/command_buffer/client/query_tracker.h" |
24 #include "gpu/command_buffer/client/transfer_buffer.h" | 23 #include "gpu/command_buffer/client/transfer_buffer.h" |
25 #include "gpu/command_buffer/client/vertex_array_object_manager.h" | 24 #include "gpu/command_buffer/client/vertex_array_object_manager.h" |
26 #include "gpu/command_buffer/common/gles2_cmd_utils.h" | 25 #include "gpu/command_buffer/common/gles2_cmd_utils.h" |
27 #include "gpu/command_buffer/common/trace_event.h" | 26 #include "gpu/command_buffer/common/trace_event.h" |
| 27 #include "ui/gfx/gpu_memory_buffer.h" |
28 | 28 |
29 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 29 #if defined(__native_client__) && !defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
30 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS | 30 #define GLES2_SUPPORT_CLIENT_SIDE_ARRAYS |
31 #endif | 31 #endif |
32 | 32 |
33 #if defined(GPU_CLIENT_DEBUG) | 33 #if defined(GPU_CLIENT_DEBUG) |
34 #include "ui/gl/gl_switches.h" | 34 #include "ui/gl/gl_switches.h" |
35 #include "base/command_line.h" | 35 #include "base/command_line.h" |
36 #endif | 36 #endif |
37 | 37 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 GLES2Implementation::SingleThreadChecker::~SingleThreadChecker() { | 79 GLES2Implementation::SingleThreadChecker::~SingleThreadChecker() { |
80 --gles2_implementation_->use_count_; | 80 --gles2_implementation_->use_count_; |
81 GPU_CHECK_EQ(0, gles2_implementation_->use_count_); | 81 GPU_CHECK_EQ(0, gles2_implementation_->use_count_); |
82 } | 82 } |
83 | 83 |
84 GLES2Implementation::GLES2Implementation( | 84 GLES2Implementation::GLES2Implementation( |
85 GLES2CmdHelper* helper, | 85 GLES2CmdHelper* helper, |
86 ShareGroup* share_group, | 86 ShareGroup* share_group, |
87 TransferBufferInterface* transfer_buffer, | 87 TransferBufferInterface* transfer_buffer, |
88 bool share_resources, | 88 bool share_resources, |
89 bool bind_generates_resource, | 89 bool bind_generates_resource) |
90 ImageFactory* image_factory) | |
91 : helper_(helper), | 90 : helper_(helper), |
92 transfer_buffer_(transfer_buffer), | 91 transfer_buffer_(transfer_buffer), |
93 angle_pack_reverse_row_order_status_(kUnknownExtensionStatus), | 92 angle_pack_reverse_row_order_status_(kUnknownExtensionStatus), |
94 chromium_framebuffer_multisample_(kUnknownExtensionStatus), | 93 chromium_framebuffer_multisample_(kUnknownExtensionStatus), |
95 pack_alignment_(4), | 94 pack_alignment_(4), |
96 unpack_alignment_(4), | 95 unpack_alignment_(4), |
97 unpack_flip_y_(false), | 96 unpack_flip_y_(false), |
98 unpack_row_length_(0), | 97 unpack_row_length_(0), |
99 unpack_skip_rows_(0), | 98 unpack_skip_rows_(0), |
100 unpack_skip_pixels_(0), | 99 unpack_skip_pixels_(0), |
101 pack_reverse_row_order_(false), | 100 pack_reverse_row_order_(false), |
102 active_texture_unit_(0), | 101 active_texture_unit_(0), |
103 bound_framebuffer_(0), | 102 bound_framebuffer_(0), |
104 bound_read_framebuffer_(0), | 103 bound_read_framebuffer_(0), |
105 bound_renderbuffer_(0), | 104 bound_renderbuffer_(0), |
106 current_program_(0), | 105 current_program_(0), |
107 bound_array_buffer_id_(0), | 106 bound_array_buffer_id_(0), |
108 bound_pixel_pack_transfer_buffer_id_(0), | 107 bound_pixel_pack_transfer_buffer_id_(0), |
109 bound_pixel_unpack_transfer_buffer_id_(0), | 108 bound_pixel_unpack_transfer_buffer_id_(0), |
110 error_bits_(0), | 109 error_bits_(0), |
111 debug_(false), | 110 debug_(false), |
112 use_count_(0), | 111 use_count_(0), |
113 current_query_(NULL), | 112 current_query_(NULL), |
114 error_message_callback_(NULL), | 113 error_message_callback_(NULL) { |
115 image_factory_(image_factory) { | |
116 GPU_DCHECK(helper); | 114 GPU_DCHECK(helper); |
117 GPU_DCHECK(transfer_buffer); | 115 GPU_DCHECK(transfer_buffer); |
118 | 116 |
119 char temp[128]; | 117 char temp[128]; |
120 sprintf(temp, "%p", static_cast<void*>(this)); | 118 sprintf(temp, "%p", static_cast<void*>(this)); |
121 this_in_hex_ = std::string(temp); | 119 this_in_hex_ = std::string(temp); |
122 | 120 |
123 GPU_CLIENT_LOG_CODE_BLOCK({ | 121 GPU_CLIENT_LOG_CODE_BLOCK({ |
124 debug_ = CommandLine::ForCurrentProcess()->HasSwitch( | 122 debug_ = CommandLine::ForCurrentProcess()->HasSwitch( |
125 switches::kEnableGPUClientLogging); | 123 switches::kEnableGPUClientLogging); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 static_state_.int_state.num_compressed_texture_formats); | 157 static_state_.int_state.num_compressed_texture_formats); |
160 util_.set_num_shader_binary_formats( | 158 util_.set_num_shader_binary_formats( |
161 static_state_.int_state.num_shader_binary_formats); | 159 static_state_.int_state.num_shader_binary_formats); |
162 | 160 |
163 texture_units_.reset( | 161 texture_units_.reset( |
164 new TextureUnit[ | 162 new TextureUnit[ |
165 static_state_.int_state.max_combined_texture_image_units]); | 163 static_state_.int_state.max_combined_texture_image_units]); |
166 | 164 |
167 query_tracker_.reset(new QueryTracker(mapped_memory_.get())); | 165 query_tracker_.reset(new QueryTracker(mapped_memory_.get())); |
168 buffer_tracker_.reset(new BufferTracker(mapped_memory_.get())); | 166 buffer_tracker_.reset(new BufferTracker(mapped_memory_.get())); |
169 gpu_memory_buffer_tracker_.reset(new GpuMemoryBufferTracker(image_factory_)); | 167 gpu_memory_buffer_tracker_.reset(new GpuMemoryBufferTracker(helper_)); |
170 | 168 |
171 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) | 169 #if defined(GLES2_SUPPORT_CLIENT_SIDE_ARRAYS) |
172 GetIdHandler(id_namespaces::kBuffers)->MakeIds( | 170 GetIdHandler(id_namespaces::kBuffers)->MakeIds( |
173 this, kClientSideArrayId, arraysize(reserved_ids_), &reserved_ids_[0]); | 171 this, kClientSideArrayId, arraysize(reserved_ids_), &reserved_ids_[0]); |
174 #endif | 172 #endif |
175 | 173 |
176 vertex_array_object_manager_.reset(new VertexArrayObjectManager( | 174 vertex_array_object_manager_.reset(new VertexArrayObjectManager( |
177 static_state_.int_state.max_vertex_attribs, | 175 static_state_.int_state.max_vertex_attribs, |
178 reserved_ids_[0], | 176 reserved_ids_[0], |
179 reserved_ids_[1])); | 177 reserved_ids_[1])); |
(...skipping 1905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2085 // Clears the bucket so if the command fails nothing will be in it. | 2083 // Clears the bucket so if the command fails nothing will be in it. |
2086 helper_->SetBucketSize(kResultBucketId, 0); | 2084 helper_->SetBucketSize(kResultBucketId, 0); |
2087 helper_->GetString(name, kResultBucketId); | 2085 helper_->GetString(name, kResultBucketId); |
2088 std::string str; | 2086 std::string str; |
2089 if (GetBucketAsString(kResultBucketId, &str)) { | 2087 if (GetBucketAsString(kResultBucketId, &str)) { |
2090 // Adds extensions implemented on client side only. | 2088 // Adds extensions implemented on client side only. |
2091 switch (name) { | 2089 switch (name) { |
2092 case GL_EXTENSIONS: | 2090 case GL_EXTENSIONS: |
2093 str += std::string(str.empty() ? "" : " ") + | 2091 str += std::string(str.empty() ? "" : " ") + |
2094 "GL_CHROMIUM_flipy " | 2092 "GL_CHROMIUM_flipy " |
| 2093 "GL_CHROMIUM_map_image " |
2095 "GL_CHROMIUM_map_sub " | 2094 "GL_CHROMIUM_map_sub " |
2096 "GL_CHROMIUM_shallow_flush " | 2095 "GL_CHROMIUM_shallow_flush " |
2097 "GL_EXT_unpack_subimage"; | 2096 "GL_EXT_unpack_subimage"; |
2098 if (image_factory_ != NULL) { | |
2099 // The first space character is intentional. | |
2100 str += " GL_CHROMIUM_map_image"; | |
2101 } | |
2102 break; | 2097 break; |
2103 default: | 2098 default: |
2104 break; | 2099 break; |
2105 } | 2100 } |
2106 | 2101 |
2107 // Because of WebGL the extensions can change. We have to cache each unique | 2102 // Because of WebGL the extensions can change. We have to cache each unique |
2108 // result since we don't know when the client will stop referring to a | 2103 // result since we don't know when the client will stop referring to a |
2109 // previous one it queries. | 2104 // previous one it queries. |
2110 GLStringMap::iterator it = gl_strings_.find(name); | 2105 GLStringMap::iterator it = gl_strings_.find(name); |
2111 if (it == gl_strings_.end()) { | 2106 if (it == gl_strings_.end()) { |
(...skipping 1586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3698 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateImageCHROMIUM(" | 3693 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateImageCHROMIUM(" |
3699 << width << ", " | 3694 << width << ", " |
3700 << height << ", " | 3695 << height << ", " |
3701 << GLES2Util::GetStringTextureInternalFormat(internalformat) << ")"); | 3696 << GLES2Util::GetStringTextureInternalFormat(internalformat) << ")"); |
3702 GLuint image_id = CreateImageCHROMIUMHelper(width, height, internalformat); | 3697 GLuint image_id = CreateImageCHROMIUMHelper(width, height, internalformat); |
3703 CheckGLError(); | 3698 CheckGLError(); |
3704 return image_id; | 3699 return image_id; |
3705 } | 3700 } |
3706 | 3701 |
3707 void GLES2Implementation::DestroyImageCHROMIUMHelper(GLuint image_id) { | 3702 void GLES2Implementation::DestroyImageCHROMIUMHelper(GLuint image_id) { |
3708 GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer(image_id); | 3703 gfx::GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer( |
| 3704 image_id); |
3709 if (!gpu_buffer) { | 3705 if (!gpu_buffer) { |
3710 SetGLError(GL_INVALID_OPERATION, "glDestroyImageCHROMIUM", "invalid image"); | 3706 SetGLError(GL_INVALID_OPERATION, "glDestroyImageCHROMIUM", "invalid image"); |
3711 return; | 3707 return; |
3712 } | 3708 } |
3713 | 3709 |
3714 // Flush the command stream to make sure all pending commands | 3710 // Flush the command stream to make sure all pending commands |
3715 // that may refer to the image_id are executed on the service side. | 3711 // that may refer to the image_id are executed on the service side. |
3716 helper_->CommandBufferHelper::Flush(); | 3712 helper_->CommandBufferHelper::Flush(); |
3717 gpu_memory_buffer_tracker_->RemoveBuffer(image_id); | 3713 gpu_memory_buffer_tracker_->RemoveBuffer(image_id); |
3718 } | 3714 } |
3719 | 3715 |
3720 void GLES2Implementation::DestroyImageCHROMIUM(GLuint image_id) { | 3716 void GLES2Implementation::DestroyImageCHROMIUM(GLuint image_id) { |
3721 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 3717 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
3722 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDestroyImageCHROMIUM(" | 3718 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDestroyImageCHROMIUM(" |
3723 << image_id << ")"); | 3719 << image_id << ")"); |
3724 DestroyImageCHROMIUMHelper(image_id); | 3720 DestroyImageCHROMIUMHelper(image_id); |
3725 CheckGLError(); | 3721 CheckGLError(); |
3726 } | 3722 } |
3727 | 3723 |
3728 void GLES2Implementation::UnmapImageCHROMIUMHelper(GLuint image_id) { | 3724 void GLES2Implementation::UnmapImageCHROMIUMHelper(GLuint image_id) { |
3729 GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer(image_id); | 3725 gfx::GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer( |
| 3726 image_id); |
3730 if (!gpu_buffer) { | 3727 if (!gpu_buffer) { |
3731 SetGLError(GL_INVALID_OPERATION, "glUnmapImageCHROMIUM", "invalid image"); | 3728 SetGLError(GL_INVALID_OPERATION, "glUnmapImageCHROMIUM", "invalid image"); |
3732 return; | 3729 return; |
3733 } | 3730 } |
3734 | 3731 |
3735 if (!gpu_buffer->IsMapped()) { | 3732 if (!gpu_buffer->IsMapped()) { |
3736 SetGLError(GL_INVALID_OPERATION, "glUnmapImageCHROMIUM", "not mapped"); | 3733 SetGLError(GL_INVALID_OPERATION, "glUnmapImageCHROMIUM", "not mapped"); |
3737 return; | 3734 return; |
3738 } | 3735 } |
3739 gpu_buffer->Unmap(); | 3736 gpu_buffer->Unmap(); |
3740 } | 3737 } |
3741 | 3738 |
3742 void GLES2Implementation::UnmapImageCHROMIUM(GLuint image_id) { | 3739 void GLES2Implementation::UnmapImageCHROMIUM(GLuint image_id) { |
3743 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 3740 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
3744 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUnmapImageCHROMIUM(" | 3741 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glUnmapImageCHROMIUM(" |
3745 << image_id << ")"); | 3742 << image_id << ")"); |
3746 | 3743 |
3747 UnmapImageCHROMIUMHelper(image_id); | 3744 UnmapImageCHROMIUMHelper(image_id); |
3748 CheckGLError(); | 3745 CheckGLError(); |
3749 } | 3746 } |
3750 | 3747 |
3751 void* GLES2Implementation::MapImageCHROMIUMHelper(GLuint image_id, | 3748 void* GLES2Implementation::MapImageCHROMIUMHelper(GLuint image_id, |
3752 GLenum access) { | 3749 GLenum access) { |
3753 GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer(image_id); | 3750 gfx::GpuMemoryBuffer* gpu_buffer = gpu_memory_buffer_tracker_->GetBuffer( |
| 3751 image_id); |
3754 if (!gpu_buffer) { | 3752 if (!gpu_buffer) { |
3755 SetGLError(GL_INVALID_OPERATION, "glMapImageCHROMIUM", "invalid image"); | 3753 SetGLError(GL_INVALID_OPERATION, "glMapImageCHROMIUM", "invalid image"); |
3756 return NULL; | 3754 return NULL; |
3757 } | 3755 } |
3758 GpuMemoryBuffer::AccessMode mode; | 3756 gfx::GpuMemoryBuffer::AccessMode mode; |
3759 switch(access) { | 3757 switch(access) { |
3760 case GL_WRITE_ONLY: | 3758 case GL_WRITE_ONLY: |
3761 mode = GpuMemoryBuffer::WRITE_ONLY; | 3759 mode = gfx::GpuMemoryBuffer::WRITE_ONLY; |
3762 break; | 3760 break; |
3763 case GL_READ_ONLY: | 3761 case GL_READ_ONLY: |
3764 mode = GpuMemoryBuffer::READ_ONLY; | 3762 mode = gfx::GpuMemoryBuffer::READ_ONLY; |
3765 break; | 3763 break; |
3766 case GL_READ_WRITE: | 3764 case GL_READ_WRITE: |
3767 mode = GpuMemoryBuffer::READ_WRITE; | 3765 mode = gfx::GpuMemoryBuffer::READ_WRITE; |
3768 break; | 3766 break; |
3769 default: | 3767 default: |
3770 SetGLError(GL_INVALID_ENUM, "glMapImageCHROMIUM", | 3768 SetGLError(GL_INVALID_ENUM, "glMapImageCHROMIUM", |
3771 "invalid GPU access mode"); | 3769 "invalid GPU access mode"); |
3772 return NULL; | 3770 return NULL; |
3773 } | 3771 } |
3774 | 3772 |
3775 if (gpu_buffer->IsMapped()) { | 3773 if (gpu_buffer->IsMapped()) { |
3776 SetGLError(GL_INVALID_OPERATION, "glMapImageCHROMIUM", "already mapped"); | 3774 SetGLError(GL_INVALID_OPERATION, "glMapImageCHROMIUM", "already mapped"); |
3777 return NULL; | 3775 return NULL; |
(...skipping 17 matching lines...) Expand all Loading... |
3795 } | 3793 } |
3796 | 3794 |
3797 void GLES2Implementation::GetImageParameterivCHROMIUMHelper( | 3795 void GLES2Implementation::GetImageParameterivCHROMIUMHelper( |
3798 GLuint image_id, GLenum pname, GLint* params) { | 3796 GLuint image_id, GLenum pname, GLint* params) { |
3799 if (pname != GL_IMAGE_ROWBYTES_CHROMIUM) { | 3797 if (pname != GL_IMAGE_ROWBYTES_CHROMIUM) { |
3800 SetGLError(GL_INVALID_ENUM, "glGetImageParameterivCHROMIUM", | 3798 SetGLError(GL_INVALID_ENUM, "glGetImageParameterivCHROMIUM", |
3801 "invalid parameter"); | 3799 "invalid parameter"); |
3802 return; | 3800 return; |
3803 } | 3801 } |
3804 | 3802 |
3805 GpuMemoryBuffer* gpu_buffer = | 3803 gfx::GpuMemoryBuffer* gpu_buffer = |
3806 gpu_memory_buffer_tracker_->GetBuffer(image_id); | 3804 gpu_memory_buffer_tracker_->GetBuffer(image_id); |
3807 if (!gpu_buffer) { | 3805 if (!gpu_buffer) { |
3808 SetGLError(GL_INVALID_OPERATION, "glGetImageParameterivCHROMIUM", | 3806 SetGLError(GL_INVALID_OPERATION, "glGetImageParameterivCHROMIUM", |
3809 "invalid image"); | 3807 "invalid image"); |
3810 return; | 3808 return; |
3811 } | 3809 } |
3812 | 3810 |
3813 *params = gpu_buffer->GetStride(); | 3811 *params = gpu_buffer->GetStride(); |
3814 } | 3812 } |
3815 | 3813 |
3816 void GLES2Implementation::GetImageParameterivCHROMIUM( | 3814 void GLES2Implementation::GetImageParameterivCHROMIUM( |
3817 GLuint image_id, GLenum pname, GLint* params) { | 3815 GLuint image_id, GLenum pname, GLint* params) { |
3818 GPU_CLIENT_SINGLE_THREAD_CHECK(); | 3816 GPU_CLIENT_SINGLE_THREAD_CHECK(); |
3819 GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); | 3817 GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLint, params); |
3820 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glImageParameterivCHROMIUM(" | 3818 GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glImageParameterivCHROMIUM(" |
3821 << image_id << ", " | 3819 << image_id << ", " |
3822 << GLES2Util::GetStringBufferParameter(pname) << ", " | 3820 << GLES2Util::GetStringBufferParameter(pname) << ", " |
3823 << static_cast<const void*>(params) << ")"); | 3821 << static_cast<const void*>(params) << ")"); |
3824 GetImageParameterivCHROMIUMHelper(image_id, pname, params); | 3822 GetImageParameterivCHROMIUMHelper(image_id, pname, params); |
3825 CheckGLError(); | 3823 CheckGLError(); |
3826 } | 3824 } |
3827 | 3825 |
3828 // Include the auto-generated part of this file. We split this because it means | 3826 // Include the auto-generated part of this file. We split this because it means |
3829 // we can easily edit the non-auto generated parts right here in this file | 3827 // we can easily edit the non-auto generated parts right here in this file |
3830 // instead of having to edit some template or the code generator. | 3828 // instead of having to edit some template or the code generator. |
3831 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" | 3829 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" |
3832 | 3830 |
3833 } // namespace gles2 | 3831 } // namespace gles2 |
3834 } // namespace gpu | 3832 } // namespace gpu |
OLD | NEW |