| 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 <limits.h> | 7 #include <limits.h> |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 #include <stdio.h> | 10 #include <stdio.h> |
| (...skipping 958 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 969 void DoCopyTexSubImage2D( | 969 void DoCopyTexSubImage2D( |
| 970 GLenum target, | 970 GLenum target, |
| 971 GLint level, | 971 GLint level, |
| 972 GLint xoffset, | 972 GLint xoffset, |
| 973 GLint yoffset, | 973 GLint yoffset, |
| 974 GLint x, | 974 GLint x, |
| 975 GLint y, | 975 GLint y, |
| 976 GLsizei width, | 976 GLsizei width, |
| 977 GLsizei height); | 977 GLsizei height); |
| 978 | 978 |
| 979 // Wrapper for TexImageIOSurface2DCHROMIUM. | |
| 980 void DoTexImageIOSurface2DCHROMIUM( | |
| 981 GLenum target, | |
| 982 GLsizei width, | |
| 983 GLsizei height, | |
| 984 GLuint io_surface_id, | |
| 985 GLuint plane); | |
| 986 | |
| 987 void DoCopyTextureCHROMIUM(GLuint source_id, | 979 void DoCopyTextureCHROMIUM(GLuint source_id, |
| 988 GLuint dest_id, | 980 GLuint dest_id, |
| 989 GLenum internal_format, | 981 GLenum internal_format, |
| 990 GLenum dest_type, | 982 GLenum dest_type, |
| 991 GLboolean unpack_flip_y, | 983 GLboolean unpack_flip_y, |
| 992 GLboolean unpack_premultiply_alpha, | 984 GLboolean unpack_premultiply_alpha, |
| 993 GLboolean unpack_unmultiply_alpha); | 985 GLboolean unpack_unmultiply_alpha); |
| 994 | 986 |
| 995 void DoCopySubTextureCHROMIUM(GLuint source_id, | 987 void DoCopySubTextureCHROMIUM(GLuint source_id, |
| 996 GLuint dest_id, | 988 GLuint dest_id, |
| (...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1863 GLuint* service_id, | 1855 GLuint* service_id, |
| 1864 SizedResult<T>** result, | 1856 SizedResult<T>** result, |
| 1865 GLenum* result_type, | 1857 GLenum* result_type, |
| 1866 GLsizei* result_size); | 1858 GLsizei* result_size); |
| 1867 | 1859 |
| 1868 bool WasContextLost() const override; | 1860 bool WasContextLost() const override; |
| 1869 bool WasContextLostByRobustnessExtension() const override; | 1861 bool WasContextLostByRobustnessExtension() const override; |
| 1870 void MarkContextLost(error::ContextLostReason reason) override; | 1862 void MarkContextLost(error::ContextLostReason reason) override; |
| 1871 bool CheckResetStatus(); | 1863 bool CheckResetStatus(); |
| 1872 | 1864 |
| 1873 #if defined(OS_MACOSX) | |
| 1874 void ReleaseIOSurfaceForTexture(GLuint texture_id); | |
| 1875 #endif | |
| 1876 | |
| 1877 bool GetCompressedTexSizeInBytes( | 1865 bool GetCompressedTexSizeInBytes( |
| 1878 const char* function_name, GLsizei width, GLsizei height, GLsizei depth, | 1866 const char* function_name, GLsizei width, GLsizei height, GLsizei depth, |
| 1879 GLenum format, GLsizei* size_in_bytes); | 1867 GLenum format, GLsizei* size_in_bytes); |
| 1880 | 1868 |
| 1881 bool ValidateCompressedTexDimensions( | 1869 bool ValidateCompressedTexDimensions( |
| 1882 const char* function_name, GLenum target, GLint level, | 1870 const char* function_name, GLenum target, GLint level, |
| 1883 GLsizei width, GLsizei height, GLsizei depth, GLenum format); | 1871 GLsizei width, GLsizei height, GLsizei depth, GLenum format); |
| 1884 bool ValidateCompressedTexFuncData( | 1872 bool ValidateCompressedTexFuncData( |
| 1885 const char* function_name, GLsizei width, GLsizei height, GLsizei depth, | 1873 const char* function_name, GLsizei width, GLsizei height, GLsizei depth, |
| 1886 GLenum format, GLsizei size); | 1874 GLenum format, GLsizei size); |
| (...skipping 284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2171 bool shader_texture_lod_explicitly_enabled_; | 2159 bool shader_texture_lod_explicitly_enabled_; |
| 2172 | 2160 |
| 2173 bool compile_shader_always_succeeds_; | 2161 bool compile_shader_always_succeeds_; |
| 2174 | 2162 |
| 2175 // An optional behaviour to lose the context and group when OOM. | 2163 // An optional behaviour to lose the context and group when OOM. |
| 2176 bool lose_context_when_out_of_memory_; | 2164 bool lose_context_when_out_of_memory_; |
| 2177 | 2165 |
| 2178 // Log extra info. | 2166 // Log extra info. |
| 2179 bool service_logging_; | 2167 bool service_logging_; |
| 2180 | 2168 |
| 2181 #if defined(OS_MACOSX) | |
| 2182 typedef std::map<GLuint, IOSurfaceRef> TextureToIOSurfaceMap; | |
| 2183 TextureToIOSurfaceMap texture_to_io_surface_map_; | |
| 2184 #endif | |
| 2185 | |
| 2186 std::unique_ptr<CopyTextureCHROMIUMResourceManager> copy_texture_CHROMIUM_; | 2169 std::unique_ptr<CopyTextureCHROMIUMResourceManager> copy_texture_CHROMIUM_; |
| 2187 std::unique_ptr<ClearFramebufferResourceManager> clear_framebuffer_blit_; | 2170 std::unique_ptr<ClearFramebufferResourceManager> clear_framebuffer_blit_; |
| 2188 | 2171 |
| 2189 // Cached values of the currently assigned viewport dimensions. | 2172 // Cached values of the currently assigned viewport dimensions. |
| 2190 GLsizei viewport_max_width_; | 2173 GLsizei viewport_max_width_; |
| 2191 GLsizei viewport_max_height_; | 2174 GLsizei viewport_max_height_; |
| 2192 | 2175 |
| 2193 // Command buffer stats. | 2176 // Command buffer stats. |
| 2194 base::TimeDelta total_processing_commands_time_; | 2177 base::TimeDelta total_processing_commands_time_; |
| 2195 | 2178 |
| (...skipping 1565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3761 if (framebuffer_state_.bound_draw_framebuffer.get()) { | 3744 if (framebuffer_state_.bound_draw_framebuffer.get()) { |
| 3762 framebuffer_state_.bound_draw_framebuffer | 3745 framebuffer_state_.bound_draw_framebuffer |
| 3763 ->UnbindTexture(GL_DRAW_FRAMEBUFFER_EXT, texture_ref); | 3746 ->UnbindTexture(GL_DRAW_FRAMEBUFFER_EXT, texture_ref); |
| 3764 } | 3747 } |
| 3765 } else { | 3748 } else { |
| 3766 if (framebuffer_state_.bound_draw_framebuffer.get()) { | 3749 if (framebuffer_state_.bound_draw_framebuffer.get()) { |
| 3767 framebuffer_state_.bound_draw_framebuffer | 3750 framebuffer_state_.bound_draw_framebuffer |
| 3768 ->UnbindTexture(GL_FRAMEBUFFER, texture_ref); | 3751 ->UnbindTexture(GL_FRAMEBUFFER, texture_ref); |
| 3769 } | 3752 } |
| 3770 } | 3753 } |
| 3771 #if defined(OS_MACOSX) | |
| 3772 GLuint service_id = texture->service_id(); | |
| 3773 if (texture->target() == GL_TEXTURE_RECTANGLE_ARB) { | |
| 3774 ReleaseIOSurfaceForTexture(service_id); | |
| 3775 } | |
| 3776 #endif | |
| 3777 RemoveTexture(client_ids[ii]); | 3754 RemoveTexture(client_ids[ii]); |
| 3778 } | 3755 } |
| 3779 } | 3756 } |
| 3780 } | 3757 } |
| 3781 | 3758 |
| 3782 void GLES2DecoderImpl::DeleteSamplersHelper( | 3759 void GLES2DecoderImpl::DeleteSamplersHelper( |
| 3783 GLsizei n, const GLuint* client_ids) { | 3760 GLsizei n, const GLuint* client_ids) { |
| 3784 for (GLsizei ii = 0; ii < n; ++ii) { | 3761 for (GLsizei ii = 0; ii < n; ++ii) { |
| 3785 Sampler* sampler = GetSampler(client_ids[ii]); | 3762 Sampler* sampler = GetSampler(client_ids[ii]); |
| 3786 if (sampler && !sampler->IsDeleted()) { | 3763 if (sampler && !sampler->IsDeleted()) { |
| (...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4382 | 4359 |
| 4383 if (group_.get()) { | 4360 if (group_.get()) { |
| 4384 group_->Destroy(this, have_context); | 4361 group_->Destroy(this, have_context); |
| 4385 group_ = NULL; | 4362 group_ = NULL; |
| 4386 } | 4363 } |
| 4387 | 4364 |
| 4388 if (context_.get()) { | 4365 if (context_.get()) { |
| 4389 context_->ReleaseCurrent(NULL); | 4366 context_->ReleaseCurrent(NULL); |
| 4390 context_ = NULL; | 4367 context_ = NULL; |
| 4391 } | 4368 } |
| 4392 | |
| 4393 #if defined(OS_MACOSX) | |
| 4394 for (TextureToIOSurfaceMap::iterator it = texture_to_io_surface_map_.begin(); | |
| 4395 it != texture_to_io_surface_map_.end(); ++it) { | |
| 4396 CFRelease(it->second); | |
| 4397 } | |
| 4398 texture_to_io_surface_map_.clear(); | |
| 4399 #endif | |
| 4400 } | 4369 } |
| 4401 | 4370 |
| 4402 void GLES2DecoderImpl::SetSurface(const scoped_refptr<gl::GLSurface>& surface) { | 4371 void GLES2DecoderImpl::SetSurface(const scoped_refptr<gl::GLSurface>& surface) { |
| 4403 DCHECK(context_->IsCurrent(NULL)); | 4372 DCHECK(context_->IsCurrent(NULL)); |
| 4404 DCHECK(surface); | 4373 DCHECK(surface); |
| 4405 surface_ = surface; | 4374 surface_ = surface; |
| 4406 RestoreCurrentFramebufferBindings(); | 4375 RestoreCurrentFramebufferBindings(); |
| 4407 } | 4376 } |
| 4408 | 4377 |
| 4409 void GLES2DecoderImpl::ReleaseSurface() { | 4378 void GLES2DecoderImpl::ReleaseSurface() { |
| (...skipping 9725 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14135 GLuint service_id = 0; | 14104 GLuint service_id = 0; |
| 14136 return path_manager()->GetPath(client_id, &service_id) && | 14105 return path_manager()->GetPath(client_id, &service_id) && |
| 14137 glIsPathNV(service_id) == GL_TRUE; | 14106 glIsPathNV(service_id) == GL_TRUE; |
| 14138 } | 14107 } |
| 14139 | 14108 |
| 14140 bool GLES2DecoderImpl::DoIsSync(GLuint client_id) { | 14109 bool GLES2DecoderImpl::DoIsSync(GLuint client_id) { |
| 14141 GLsync service_sync = 0; | 14110 GLsync service_sync = 0; |
| 14142 return group_->GetSyncServiceId(client_id, &service_sync); | 14111 return group_->GetSyncServiceId(client_id, &service_sync); |
| 14143 } | 14112 } |
| 14144 | 14113 |
| 14145 #if defined(OS_MACOSX) | |
| 14146 void GLES2DecoderImpl::ReleaseIOSurfaceForTexture(GLuint texture_id) { | |
| 14147 TextureToIOSurfaceMap::iterator it = texture_to_io_surface_map_.find( | |
| 14148 texture_id); | |
| 14149 if (it != texture_to_io_surface_map_.end()) { | |
| 14150 // Found a previous IOSurface bound to this texture; release it. | |
| 14151 IOSurfaceRef surface = it->second; | |
| 14152 CFRelease(surface); | |
| 14153 texture_to_io_surface_map_.erase(it); | |
| 14154 } | |
| 14155 } | |
| 14156 #endif | |
| 14157 | |
| 14158 void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM( | |
| 14159 GLenum target, GLsizei width, GLsizei height, | |
| 14160 GLuint io_surface_id, GLuint plane) { | |
| 14161 #if defined(OS_MACOSX) | |
| 14162 if (gl::GetGLImplementation() != gl::kGLImplementationDesktopGL) { | |
| 14163 LOCAL_SET_GL_ERROR( | |
| 14164 GL_INVALID_OPERATION, | |
| 14165 "glTexImageIOSurface2DCHROMIUM", "only supported on desktop GL."); | |
| 14166 return; | |
| 14167 } | |
| 14168 | |
| 14169 if (target != GL_TEXTURE_RECTANGLE_ARB) { | |
| 14170 // This might be supported in the future, and if we could require | |
| 14171 // support for binding an IOSurface to a NPOT TEXTURE_2D texture, we | |
| 14172 // could delete a lot of code. For now, perform strict validation so we | |
| 14173 // know what's going on. | |
| 14174 LOCAL_SET_GL_ERROR( | |
| 14175 GL_INVALID_OPERATION, | |
| 14176 "glTexImageIOSurface2DCHROMIUM", | |
| 14177 "requires TEXTURE_RECTANGLE_ARB target"); | |
| 14178 return; | |
| 14179 } | |
| 14180 | |
| 14181 // Default target might be conceptually valid, but disallow it to avoid | |
| 14182 // accidents. | |
| 14183 TextureRef* texture_ref = | |
| 14184 texture_manager()->GetTextureInfoForTargetUnlessDefault(&state_, target); | |
| 14185 if (!texture_ref) { | |
| 14186 LOCAL_SET_GL_ERROR( | |
| 14187 GL_INVALID_OPERATION, | |
| 14188 "glTexImageIOSurface2DCHROMIUM", "no rectangle texture bound"); | |
| 14189 return; | |
| 14190 } | |
| 14191 | |
| 14192 // Look up the new IOSurface. Note that because of asynchrony | |
| 14193 // between processes this might fail; during live resizing the | |
| 14194 // plugin process might allocate and release an IOSurface before | |
| 14195 // this process gets a chance to look it up. Hold on to any old | |
| 14196 // IOSurface in this case. | |
| 14197 IOSurfaceRef surface = IOSurfaceLookup(io_surface_id); | |
| 14198 if (!surface) { | |
| 14199 LOCAL_SET_GL_ERROR( | |
| 14200 GL_INVALID_OPERATION, | |
| 14201 "glTexImageIOSurface2DCHROMIUM", "no IOSurface with the given ID"); | |
| 14202 return; | |
| 14203 } | |
| 14204 | |
| 14205 // Release any IOSurface previously bound to this texture. | |
| 14206 ReleaseIOSurfaceForTexture(texture_ref->service_id()); | |
| 14207 | |
| 14208 // Make sure we release the IOSurface even if CGLTexImageIOSurface2D fails. | |
| 14209 texture_to_io_surface_map_.insert( | |
| 14210 std::make_pair(texture_ref->service_id(), surface)); | |
| 14211 | |
| 14212 CGLContextObj context = | |
| 14213 static_cast<CGLContextObj>(context_->GetHandle()); | |
| 14214 | |
| 14215 CGLError err = CGLTexImageIOSurface2D( | |
| 14216 context, | |
| 14217 target, | |
| 14218 GL_RGBA, | |
| 14219 width, | |
| 14220 height, | |
| 14221 GL_BGRA, | |
| 14222 GL_UNSIGNED_INT_8_8_8_8_REV, | |
| 14223 surface, | |
| 14224 plane); | |
| 14225 | |
| 14226 if (err != kCGLNoError) { | |
| 14227 LOCAL_SET_GL_ERROR( | |
| 14228 GL_INVALID_OPERATION, | |
| 14229 "glTexImageIOSurface2DCHROMIUM", "error in CGLTexImageIOSurface2D"); | |
| 14230 return; | |
| 14231 } | |
| 14232 | |
| 14233 texture_manager()->SetLevelInfo( | |
| 14234 texture_ref, target, 0, GL_RGBA, width, height, 1, 0, GL_BGRA, | |
| 14235 GL_UNSIGNED_INT_8_8_8_8_REV, gfx::Rect(width, height)); | |
| 14236 | |
| 14237 #else | |
| 14238 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, | |
| 14239 "glTexImageIOSurface2DCHROMIUM", "not supported."); | |
| 14240 #endif | |
| 14241 } | |
| 14242 | |
| 14243 bool GLES2DecoderImpl::ValidateCopyTextureCHROMIUMTextures( | 14114 bool GLES2DecoderImpl::ValidateCopyTextureCHROMIUMTextures( |
| 14244 const char* function_name, | 14115 const char* function_name, |
| 14245 TextureRef* source_texture_ref, | 14116 TextureRef* source_texture_ref, |
| 14246 TextureRef* dest_texture_ref) { | 14117 TextureRef* dest_texture_ref) { |
| 14247 if (!source_texture_ref || !dest_texture_ref) { | 14118 if (!source_texture_ref || !dest_texture_ref) { |
| 14248 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "unknown texture id"); | 14119 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, function_name, "unknown texture id"); |
| 14249 return false; | 14120 return false; |
| 14250 } | 14121 } |
| 14251 | 14122 |
| 14252 Texture* source_texture = source_texture_ref->texture(); | 14123 Texture* source_texture = source_texture_ref->texture(); |
| (...skipping 2663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16916 } | 16787 } |
| 16917 | 16788 |
| 16918 // Include the auto-generated part of this file. We split this because it means | 16789 // Include the auto-generated part of this file. We split this because it means |
| 16919 // we can easily edit the non-auto generated parts right here in this file | 16790 // we can easily edit the non-auto generated parts right here in this file |
| 16920 // instead of having to edit some template or the code generator. | 16791 // instead of having to edit some template or the code generator. |
| 16921 #include "base/macros.h" | 16792 #include "base/macros.h" |
| 16922 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 16793 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
| 16923 | 16794 |
| 16924 } // namespace gles2 | 16795 } // namespace gles2 |
| 16925 } // namespace gpu | 16796 } // namespace gpu |
| OLD | NEW |