Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1596)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 8680002: Added minimal support to command buffer for GL_ARB_texture_rectangle (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #if defined(OS_MACOSX)
19 #include "base/mac/scoped_cftyperef.h"
20 #endif
18 #include "base/memory/scoped_ptr.h" 21 #include "base/memory/scoped_ptr.h"
19 #include "base/memory/weak_ptr.h" 22 #include "base/memory/weak_ptr.h"
20 #include "build/build_config.h" 23 #include "build/build_config.h"
21 #define GLES2_GPU_SERVICE 1 24 #define GLES2_GPU_SERVICE 1
22 #include "gpu/command_buffer/common/gles2_cmd_format.h" 25 #include "gpu/command_buffer/common/gles2_cmd_format.h"
23 #include "gpu/command_buffer/common/gles2_cmd_utils.h" 26 #include "gpu/command_buffer/common/gles2_cmd_utils.h"
24 #include "gpu/command_buffer/common/id_allocator.h" 27 #include "gpu/command_buffer/common/id_allocator.h"
25 #include "gpu/command_buffer/common/trace_event.h" 28 #include "gpu/command_buffer/common/trace_event.h"
26 #include "gpu/command_buffer/service/buffer_manager.h" 29 #include "gpu/command_buffer/service/buffer_manager.h"
27 #include "gpu/command_buffer/service/cmd_buffer_engine.h" 30 #include "gpu/command_buffer/service/cmd_buffer_engine.h"
28 #include "gpu/command_buffer/service/context_group.h" 31 #include "gpu/command_buffer/service/context_group.h"
29 #include "gpu/command_buffer/service/feature_info.h" 32 #include "gpu/command_buffer/service/feature_info.h"
30 #include "gpu/command_buffer/service/framebuffer_manager.h" 33 #include "gpu/command_buffer/service/framebuffer_manager.h"
31 #include "gpu/command_buffer/service/gl_utils.h" 34 #include "gpu/command_buffer/service/gl_utils.h"
32 #include "gpu/command_buffer/service/gles2_cmd_validation.h" 35 #include "gpu/command_buffer/service/gles2_cmd_validation.h"
33 #include "gpu/command_buffer/service/program_manager.h" 36 #include "gpu/command_buffer/service/program_manager.h"
34 #include "gpu/command_buffer/service/renderbuffer_manager.h" 37 #include "gpu/command_buffer/service/renderbuffer_manager.h"
35 #include "gpu/command_buffer/service/shader_manager.h" 38 #include "gpu/command_buffer/service/shader_manager.h"
36 #include "gpu/command_buffer/service/shader_translator.h" 39 #include "gpu/command_buffer/service/shader_translator.h"
37 #include "gpu/command_buffer/service/stream_texture.h" 40 #include "gpu/command_buffer/service/stream_texture.h"
38 #include "gpu/command_buffer/service/stream_texture_manager.h" 41 #include "gpu/command_buffer/service/stream_texture_manager.h"
39 #include "gpu/command_buffer/service/texture_manager.h" 42 #include "gpu/command_buffer/service/texture_manager.h"
40 #include "gpu/command_buffer/service/vertex_attrib_manager.h" 43 #include "gpu/command_buffer/service/vertex_attrib_manager.h"
41 #include "ui/gfx/gl/gl_context.h" 44 #include "ui/gfx/gl/gl_context.h"
42 #include "ui/gfx/gl/gl_implementation.h" 45 #include "ui/gfx/gl/gl_implementation.h"
43 #include "ui/gfx/gl/gl_surface.h" 46 #include "ui/gfx/gl/gl_surface.h"
47 #if defined(OS_MACOSX)
48 #include "ui/gfx/surface/io_surface_support_mac.h"
49 #endif
44 50
45 #if !defined(GL_DEPTH24_STENCIL8) 51 #if !defined(GL_DEPTH24_STENCIL8)
46 #define GL_DEPTH24_STENCIL8 0x88F0 52 #define GL_DEPTH24_STENCIL8 0x88F0
47 #endif 53 #endif
48 54
49 namespace gpu { 55 namespace gpu {
50 namespace gles2 { 56 namespace gles2 {
51 57
52 namespace { 58 namespace {
53 static const char kOESDerivativeExtension[] = "GL_OES_standard_derivatives"; 59 static const char kOESDerivativeExtension[] = "GL_OES_standard_derivatives";
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 TextureManager::TextureInfo::Ref bound_texture_2d; 559 TextureManager::TextureInfo::Ref bound_texture_2d;
554 560
555 // texture currently bound to this unit's GL_TEXTURE_CUBE_MAP with 561 // texture currently bound to this unit's GL_TEXTURE_CUBE_MAP with
556 // glBindTexture 562 // glBindTexture
557 TextureManager::TextureInfo::Ref bound_texture_cube_map; 563 TextureManager::TextureInfo::Ref bound_texture_cube_map;
558 564
559 // texture currently bound to this unit's GL_TEXTURE_EXTERNAL_OES with 565 // texture currently bound to this unit's GL_TEXTURE_EXTERNAL_OES with
560 // glBindTexture 566 // glBindTexture
561 TextureManager::TextureInfo::Ref bound_texture_external_oes; 567 TextureManager::TextureInfo::Ref bound_texture_external_oes;
562 568
569 // texture currently bound to this unit's GL_TEXTURE_RECTANGLE_ARB with
570 // glBindTexture
571 TextureManager::TextureInfo::Ref bound_texture_rectangle_arb;
572
563 TextureManager::TextureInfo::Ref GetInfoForSamplerType(GLenum type) { 573 TextureManager::TextureInfo::Ref GetInfoForSamplerType(GLenum type) {
564 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || 574 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE ||
565 type == GL_SAMPLER_EXTERNAL_OES); 575 type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_2D_RECT_ARB);
566 return type == GL_SAMPLER_2D ? bound_texture_2d : 576 switch (type) {
567 (type == GL_SAMPLER_EXTERNAL_OES ? bound_texture_external_oes : 577 case GL_SAMPLER_2D:
568 bound_texture_cube_map); 578 return bound_texture_2d;
579 case GL_SAMPLER_CUBE:
580 return bound_texture_cube_map;
581 case GL_SAMPLER_EXTERNAL_OES:
582 return bound_texture_external_oes;
583 case GL_SAMPLER_2D_RECT_ARB:
584 return bound_texture_rectangle_arb;
585 }
586
587 NOTREACHED();
588 return NULL;
569 } 589 }
570 590
571 void Unbind(TextureManager::TextureInfo* texture) { 591 void Unbind(TextureManager::TextureInfo* texture) {
572 if (bound_texture_2d == texture) { 592 if (bound_texture_2d == texture) {
573 bound_texture_2d = NULL; 593 bound_texture_2d = NULL;
574 } 594 }
575 if (bound_texture_cube_map == texture) { 595 if (bound_texture_cube_map == texture) {
576 bound_texture_cube_map = NULL; 596 bound_texture_cube_map = NULL;
577 } 597 }
578 if (bound_texture_external_oes == texture) { 598 if (bound_texture_external_oes == texture) {
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
716 GLenum target, 736 GLenum target,
717 GLint level, 737 GLint level,
718 GLint xoffset, 738 GLint xoffset,
719 GLint yoffset, 739 GLint yoffset,
720 GLsizei width, 740 GLsizei width,
721 GLsizei height, 741 GLsizei height,
722 GLenum format, 742 GLenum format,
723 GLenum type, 743 GLenum type,
724 const void * data); 744 const void * data);
725 745
746 // Wrapper for TexImageIOSurface2DCHROMIUM.
747 void DoTexImageIOSurface2DCHROMIUM(
748 GLenum target,
749 GLsizei width,
750 GLsizei height,
751 GLuint io_surface_id,
752 GLuint plane);
753
726 // Creates a ProgramInfo for the given program. 754 // Creates a ProgramInfo for the given program.
727 ProgramManager::ProgramInfo* CreateProgramInfo( 755 ProgramManager::ProgramInfo* CreateProgramInfo(
728 GLuint client_id, GLuint service_id) { 756 GLuint client_id, GLuint service_id) {
729 return program_manager()->CreateProgramInfo(client_id, service_id); 757 return program_manager()->CreateProgramInfo(client_id, service_id);
730 } 758 }
731 759
732 // Gets the program info for the given program. Returns NULL if none exists. 760 // Gets the program info for the given program. Returns NULL if none exists.
733 ProgramManager::ProgramInfo* GetProgramInfo(GLuint client_id) { 761 ProgramManager::ProgramInfo* GetProgramInfo(GLuint client_id) {
734 return program_manager()->GetProgramInfo(client_id); 762 return program_manager()->GetProgramInfo(client_id);
735 } 763 }
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after
1174 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 1202 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
1175 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 1203 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
1176 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 1204 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
1177 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 1205 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
1178 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 1206 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
1179 info = unit.bound_texture_cube_map; 1207 info = unit.bound_texture_cube_map;
1180 break; 1208 break;
1181 case GL_TEXTURE_EXTERNAL_OES: 1209 case GL_TEXTURE_EXTERNAL_OES:
1182 info = unit.bound_texture_external_oes; 1210 info = unit.bound_texture_external_oes;
1183 break; 1211 break;
1184 // Note: If we ever support TEXTURE_RECTANGLE as a target, be sure to 1212 case GL_TEXTURE_RECTANGLE_ARB:
1185 // track |texture_| with the currently bound TEXTURE_RECTANGLE texture, 1213 info = unit.bound_texture_rectangle_arb;
1186 // because |texture_| is used by the FBO rendering mechanism for readback 1214 break;
1187 // to the bits that get sent to the browser.
1188 default: 1215 default:
1189 NOTREACHED(); 1216 NOTREACHED();
1190 return NULL; 1217 return NULL;
1191 } 1218 }
1192 return info; 1219 return info;
1193 } 1220 }
1194 1221
1195 GLenum GetBindTargetForSamplerType(GLenum type) { 1222 GLenum GetBindTargetForSamplerType(GLenum type) {
1196 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || 1223 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE ||
1197 type == GL_SAMPLER_EXTERNAL_OES); 1224 type == GL_SAMPLER_EXTERNAL_OES || type == GL_SAMPLER_2D_RECT_ARB);
1198 return type == GL_SAMPLER_2D ? GL_TEXTURE_2D : 1225 switch (type) {
1199 (type == GL_SAMPLER_EXTERNAL_OES ? GL_TEXTURE_EXTERNAL_OES : 1226 case GL_SAMPLER_2D:
1200 GL_TEXTURE_CUBE_MAP); 1227 return GL_TEXTURE_2D;
1228 case GL_SAMPLER_CUBE:
1229 return GL_TEXTURE_CUBE_MAP;
1230 case GL_SAMPLER_EXTERNAL_OES:
1231 return GL_TEXTURE_EXTERNAL_OES;
1232 case GL_SAMPLER_2D_RECT_ARB:
1233 return GL_TEXTURE_RECTANGLE_ARB;
1234 }
1235
1236 NOTREACHED();
1237 return 0;
1201 } 1238 }
1202 1239
1203 // Gets the framebuffer info for a particular target. 1240 // Gets the framebuffer info for a particular target.
1204 FramebufferManager::FramebufferInfo* GetFramebufferInfoForTarget( 1241 FramebufferManager::FramebufferInfo* GetFramebufferInfoForTarget(
1205 GLenum target) { 1242 GLenum target) {
1206 FramebufferManager::FramebufferInfo* info = NULL; 1243 FramebufferManager::FramebufferInfo* info = NULL;
1207 switch (target) { 1244 switch (target) {
1208 case GL_FRAMEBUFFER: 1245 case GL_FRAMEBUFFER:
1209 case GL_DRAW_FRAMEBUFFER: 1246 case GL_DRAW_FRAMEBUFFER:
1210 info = bound_draw_framebuffer_; 1247 info = bound_draw_framebuffer_;
(...skipping 27 matching lines...) Expand all
1238 // should be called. 1275 // should be called.
1239 bool GetUniformSetup( 1276 bool GetUniformSetup(
1240 GLuint program, GLint location, 1277 GLuint program, GLint location,
1241 uint32 shm_id, uint32 shm_offset, 1278 uint32 shm_id, uint32 shm_offset,
1242 error::Error* error, GLuint* service_id, void** result, 1279 error::Error* error, GLuint* service_id, void** result,
1243 GLenum* result_type); 1280 GLenum* result_type);
1244 1281
1245 // Returns true if the context was just lost due to e.g. GL_ARB_robustness. 1282 // Returns true if the context was just lost due to e.g. GL_ARB_robustness.
1246 bool WasContextLost(); 1283 bool WasContextLost();
1247 1284
1285 #if defined(OS_MACOSX)
1286 void ReleaseIOSurfaceForTexture(GLuint texture_id);
1287 #endif
1288
1248 // Generate a member function prototype for each command in an automated and 1289 // Generate a member function prototype for each command in an automated and
1249 // typesafe way. 1290 // typesafe way.
1250 #define GLES2_CMD_OP(name) \ 1291 #define GLES2_CMD_OP(name) \
1251 Error Handle ## name( \ 1292 Error Handle ## name( \
1252 uint32 immediate_data_size, \ 1293 uint32 immediate_data_size, \
1253 const gles2::name& args); \ 1294 const gles2::name& args); \
1254 1295
1255 GLES2_COMMAND_LIST(GLES2_CMD_OP) 1296 GLES2_COMMAND_LIST(GLES2_CMD_OP)
1256 1297
1257 #undef GLES2_CMD_OP 1298 #undef GLES2_CMD_OP
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1415 bool needs_glsl_built_in_function_emulation_; 1456 bool needs_glsl_built_in_function_emulation_;
1416 1457
1417 // These flags are used to override the state of the shared feature_info_ 1458 // These flags are used to override the state of the shared feature_info_
1418 // member. Because the same FeatureInfo instance may be shared among many 1459 // member. Because the same FeatureInfo instance may be shared among many
1419 // contexts, the assumptions on the availablity of extensions in WebGL 1460 // contexts, the assumptions on the availablity of extensions in WebGL
1420 // contexts may be broken. These flags override the shared state to preserve 1461 // contexts may be broken. These flags override the shared state to preserve
1421 // WebGL semantics. 1462 // WebGL semantics.
1422 bool force_webgl_glsl_validation_; 1463 bool force_webgl_glsl_validation_;
1423 bool derivatives_explicitly_enabled_; 1464 bool derivatives_explicitly_enabled_;
1424 1465
1466 #if defined(OS_MACOSX)
1467 typedef std::map<GLuint, CFTypeRef> TextureToIOSurfaceMap;
1468 TextureToIOSurfaceMap texture_to_io_surface_map_;
1469 #endif
1470
1425 DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl); 1471 DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl);
1426 }; 1472 };
1427 1473
1428 ScopedGLErrorSuppressor::ScopedGLErrorSuppressor(GLES2DecoderImpl* decoder) 1474 ScopedGLErrorSuppressor::ScopedGLErrorSuppressor(GLES2DecoderImpl* decoder)
1429 : decoder_(decoder) { 1475 : decoder_(decoder) {
1430 decoder_->CopyRealGLErrorsToWrapper(); 1476 decoder_->CopyRealGLErrorsToWrapper();
1431 } 1477 }
1432 1478
1433 ScopedGLErrorSuppressor::~ScopedGLErrorSuppressor() { 1479 ScopedGLErrorSuppressor::~ScopedGLErrorSuppressor() {
1434 decoder_->ClearRealGLErrors(); 1480 decoder_->ClearRealGLErrors();
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
1876 new TextureUnit[group_->max_texture_units()]); 1922 new TextureUnit[group_->max_texture_units()]);
1877 for (uint32 tt = 0; tt < group_->max_texture_units(); ++tt) { 1923 for (uint32 tt = 0; tt < group_->max_texture_units(); ++tt) {
1878 glActiveTexture(GL_TEXTURE0 + tt); 1924 glActiveTexture(GL_TEXTURE0 + tt);
1879 // We want the last bind to be 2D. 1925 // We want the last bind to be 2D.
1880 TextureManager::TextureInfo* info; 1926 TextureManager::TextureInfo* info;
1881 if (feature_info_->feature_flags().oes_egl_image_external) { 1927 if (feature_info_->feature_flags().oes_egl_image_external) {
1882 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_EXTERNAL_OES); 1928 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_EXTERNAL_OES);
1883 texture_units_[tt].bound_texture_external_oes = info; 1929 texture_units_[tt].bound_texture_external_oes = info;
1884 glBindTexture(GL_TEXTURE_EXTERNAL_OES, info->service_id()); 1930 glBindTexture(GL_TEXTURE_EXTERNAL_OES, info->service_id());
1885 } 1931 }
1932 if (feature_info_->feature_flags().arb_texture_rectangle) {
1933 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_RECTANGLE_ARB);
1934 texture_units_[tt].bound_texture_rectangle_arb = info;
1935 glBindTexture(GL_TEXTURE_RECTANGLE_ARB, info->service_id());
1936 }
1886 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP); 1937 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_CUBE_MAP);
1887 texture_units_[tt].bound_texture_cube_map = info; 1938 texture_units_[tt].bound_texture_cube_map = info;
1888 glBindTexture(GL_TEXTURE_CUBE_MAP, info->service_id()); 1939 glBindTexture(GL_TEXTURE_CUBE_MAP, info->service_id());
1889 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D); 1940 info = texture_manager()->GetDefaultTextureInfo(GL_TEXTURE_2D);
1890 texture_units_[tt].bound_texture_2d = info; 1941 texture_units_[tt].bound_texture_2d = info;
1891 glBindTexture(GL_TEXTURE_2D, info->service_id()); 1942 glBindTexture(GL_TEXTURE_2D, info->service_id());
1892 } 1943 }
1893 glActiveTexture(GL_TEXTURE0); 1944 glActiveTexture(GL_TEXTURE0);
1894 CHECK_GL_ERROR(); 1945 CHECK_GL_ERROR();
1895 1946
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
2096 resources.MaxTextureImageUnits = group_->max_texture_image_units(); 2147 resources.MaxTextureImageUnits = group_->max_texture_image_units();
2097 resources.MaxFragmentUniformVectors = 2148 resources.MaxFragmentUniformVectors =
2098 group_->max_fragment_uniform_vectors(); 2149 group_->max_fragment_uniform_vectors();
2099 resources.MaxDrawBuffers = 1; 2150 resources.MaxDrawBuffers = 1;
2100 2151
2101 if (force_webgl_glsl_validation_) { 2152 if (force_webgl_glsl_validation_) {
2102 resources.OES_standard_derivatives = derivatives_explicitly_enabled_; 2153 resources.OES_standard_derivatives = derivatives_explicitly_enabled_;
2103 } else { 2154 } else {
2104 resources.OES_standard_derivatives = 2155 resources.OES_standard_derivatives =
2105 feature_info_->feature_flags().oes_standard_derivatives ? 1 : 0; 2156 feature_info_->feature_flags().oes_standard_derivatives ? 1 : 0;
2157 resources.ARB_texture_rectangle =
2158 feature_info_->feature_flags().arb_texture_rectangle ? 1 : 0;
2106 } 2159 }
2107 2160
2108 vertex_translator_.reset(new ShaderTranslator); 2161 vertex_translator_.reset(new ShaderTranslator);
2109 ShShaderSpec shader_spec = force_webgl_glsl_validation_ || 2162 ShShaderSpec shader_spec = force_webgl_glsl_validation_ ||
2110 feature_info_->feature_flags().chromium_webglsl ? 2163 feature_info_->feature_flags().chromium_webglsl ?
2111 SH_WEBGL_SPEC : SH_GLES2_SPEC; 2164 SH_WEBGL_SPEC : SH_GLES2_SPEC;
2112 ShaderTranslatorInterface::GlslImplementationType implementation_type = 2165 ShaderTranslatorInterface::GlslImplementationType implementation_type =
2113 gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 ? 2166 gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2 ?
2114 ShaderTranslatorInterface::kGlslES : ShaderTranslatorInterface::kGlsl; 2167 ShaderTranslatorInterface::kGlslES : ShaderTranslatorInterface::kGlsl;
2115 ShaderTranslatorInterface::GlslBuiltInFunctionBehavior function_behavior = 2168 ShaderTranslatorInterface::GlslBuiltInFunctionBehavior function_behavior =
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
2299 } 2352 }
2300 } else { 2353 } else {
2301 if (bound_draw_framebuffer_) { 2354 if (bound_draw_framebuffer_) {
2302 bound_draw_framebuffer_->UnbindTexture(GL_FRAMEBUFFER, texture); 2355 bound_draw_framebuffer_->UnbindTexture(GL_FRAMEBUFFER, texture);
2303 } 2356 }
2304 } 2357 }
2305 GLuint service_id = texture->service_id(); 2358 GLuint service_id = texture->service_id();
2306 if (texture->IsStreamTexture() && stream_texture_manager_) { 2359 if (texture->IsStreamTexture() && stream_texture_manager_) {
2307 stream_texture_manager_->DestroyStreamTexture(service_id); 2360 stream_texture_manager_->DestroyStreamTexture(service_id);
2308 } 2361 }
2362 #if defined(OS_MACOSX)
2363 if (texture->target() == GL_TEXTURE_RECTANGLE_ARB) {
2364 ReleaseIOSurfaceForTexture(service_id);
2365 }
2366 #endif
2309 glDeleteTextures(1, &service_id); 2367 glDeleteTextures(1, &service_id);
2310 RemoveTextureInfo(client_ids[ii]); 2368 RemoveTextureInfo(client_ids[ii]);
2311 } 2369 }
2312 } 2370 }
2313 } 2371 }
2314 2372
2315 // } // anonymous namespace 2373 // } // anonymous namespace
2316 2374
2317 bool GLES2DecoderImpl::MakeCurrent() { 2375 bool GLES2DecoderImpl::MakeCurrent() {
2318 bool result = context_.get() ? context_->MakeCurrent(surface_.get()) : false; 2376 bool result = context_.get() ? context_->MakeCurrent(surface_.get()) : false;
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
2611 2669
2612 offscreen_target_frame_buffer_.reset(); 2670 offscreen_target_frame_buffer_.reset();
2613 offscreen_target_color_texture_.reset(); 2671 offscreen_target_color_texture_.reset();
2614 offscreen_target_color_render_buffer_.reset(); 2672 offscreen_target_color_render_buffer_.reset();
2615 offscreen_target_depth_render_buffer_.reset(); 2673 offscreen_target_depth_render_buffer_.reset();
2616 offscreen_target_stencil_render_buffer_.reset(); 2674 offscreen_target_stencil_render_buffer_.reset();
2617 offscreen_saved_frame_buffer_.reset(); 2675 offscreen_saved_frame_buffer_.reset();
2618 offscreen_saved_color_texture_.reset(); 2676 offscreen_saved_color_texture_.reset();
2619 offscreen_resolved_frame_buffer_.reset(); 2677 offscreen_resolved_frame_buffer_.reset();
2620 offscreen_resolved_color_texture_.reset(); 2678 offscreen_resolved_color_texture_.reset();
2679
2680 #if defined(OS_MACOSX)
2681 for (TextureToIOSurfaceMap::iterator it = texture_to_io_surface_map_.begin();
2682 it != texture_to_io_surface_map_.end(); ++it) {
2683 CFRelease(it->second);
2684 }
2685 texture_to_io_surface_map_.clear();
2686 #endif
2621 } 2687 }
2622 2688
2623 bool GLES2DecoderImpl::SetParent(GLES2Decoder* new_parent, 2689 bool GLES2DecoderImpl::SetParent(GLES2Decoder* new_parent,
2624 uint32 new_parent_texture_id) { 2690 uint32 new_parent_texture_id) {
2625 if (!offscreen_saved_color_texture_.get()) 2691 if (!offscreen_saved_color_texture_.get())
2626 return false; 2692 return false;
2627 2693
2628 // Remove the saved frame buffer mapping from the parent decoder. The 2694 // Remove the saved frame buffer mapping from the parent decoder. The
2629 // parent pointer is a weak pointer so it will be null if the parent has 2695 // parent pointer is a weak pointer so it will be null if the parent has
2630 // already been destroyed. 2696 // already been destroyed.
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
3124 case GL_TEXTURE_EXTERNAL_OES: 3190 case GL_TEXTURE_EXTERNAL_OES:
3125 unit.bound_texture_external_oes = info; 3191 unit.bound_texture_external_oes = info;
3126 if (info->IsStreamTexture()) { 3192 if (info->IsStreamTexture()) {
3127 DCHECK(stream_texture_manager_); 3193 DCHECK(stream_texture_manager_);
3128 StreamTexture* stream_tex = 3194 StreamTexture* stream_tex =
3129 stream_texture_manager_->LookupStreamTexture(info->service_id()); 3195 stream_texture_manager_->LookupStreamTexture(info->service_id());
3130 if (stream_tex) 3196 if (stream_tex)
3131 stream_tex->Update(); 3197 stream_tex->Update();
3132 } 3198 }
3133 break; 3199 break;
3200 case GL_TEXTURE_RECTANGLE_ARB:
3201 unit.bound_texture_rectangle_arb = info;
3202 break;
3134 default: 3203 default:
3135 NOTREACHED(); // Validation should prevent us getting here. 3204 NOTREACHED(); // Validation should prevent us getting here.
3136 break; 3205 break;
3137 } 3206 }
3138 } 3207 }
3139 3208
3140 void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) { 3209 void GLES2DecoderImpl::DoDisableVertexAttribArray(GLuint index) {
3141 if (vertex_attrib_manager_.Enable(index, false)) { 3210 if (vertex_attrib_manager_.Enable(index, false)) {
3142 if (index != 0 || 3211 if (index != 0 ||
3143 gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) { 3212 gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2) {
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
3466 if (unit.bound_texture_external_oes) { 3535 if (unit.bound_texture_external_oes) {
3467 GLuint client_id = 0; 3536 GLuint client_id = 0;
3468 texture_manager()->GetClientId( 3537 texture_manager()->GetClientId(
3469 unit.bound_texture_external_oes->service_id(), &client_id); 3538 unit.bound_texture_external_oes->service_id(), &client_id);
3470 *params = client_id; 3539 *params = client_id;
3471 } else { 3540 } else {
3472 *params = 0; 3541 *params = 0;
3473 } 3542 }
3474 } 3543 }
3475 return true; 3544 return true;
3545 case GL_TEXTURE_BINDING_RECTANGLE_ARB:
3546 *num_written = 1;
3547 if (params) {
3548 TextureUnit& unit = texture_units_[active_texture_unit_];
3549 if (unit.bound_texture_rectangle_arb) {
3550 GLuint client_id = 0;
3551 texture_manager()->GetClientId(
3552 unit.bound_texture_rectangle_arb->service_id(), &client_id);
3553 *params = client_id;
3554 } else {
3555 *params = 0;
3556 }
3557 }
3558 return true;
3476 default: 3559 default:
3477 *num_written = util_.GLGetNumValuesReturned(pname); 3560 *num_written = util_.GLGetNumValuesReturned(pname);
3478 return false; 3561 return false;
3479 } 3562 }
3480 } 3563 }
3481 3564
3482 bool GLES2DecoderImpl::GetNumValuesReturnedForGLGet( 3565 bool GLES2DecoderImpl::GetNumValuesReturnedForGLGet(
3483 GLenum pname, GLsizei* num_values) { 3566 GLenum pname, GLsizei* num_values) {
3484 return GetHelper(pname, NULL, num_values); 3567 return GetHelper(pname, NULL, num_values);
3485 } 3568 }
(...skipping 3993 matching lines...) Expand 10 before | Expand all | Expand 10 after
7479 info->SetStreamTexture(false); 7562 info->SetStreamTexture(false);
7480 texture_manager()->SetInfoTarget(feature_info_, info, 0); 7563 texture_manager()->SetInfoTarget(feature_info_, info, 0);
7481 } else { 7564 } else {
7482 SetGLError(GL_INVALID_VALUE, 7565 SetGLError(GL_INVALID_VALUE,
7483 "glDestroyStreamTextureCHROMIUM: bad texture id."); 7566 "glDestroyStreamTextureCHROMIUM: bad texture id.");
7484 } 7567 }
7485 7568
7486 return error::kNoError; 7569 return error::kNoError;
7487 } 7570 }
7488 7571
7572 #if defined(OS_MACOSX)
7573 void GLES2DecoderImpl::ReleaseIOSurfaceForTexture(GLuint texture_id) {
7574 TextureToIOSurfaceMap::iterator it = texture_to_io_surface_map_.find(
7575 texture_id);
7576 if (it != texture_to_io_surface_map_.end()) {
greggman 2011/11/28 22:58:11 I don't know the use case but is there any issue w
7577 // Found a previous IOSurface bound to this texture; release it.
7578 CFTypeRef surface = it->second;
7579 CFRelease(surface);
7580 texture_to_io_surface_map_.erase(it);
7581 }
7582 }
7583 #endif
7584
7585 void GLES2DecoderImpl::DoTexImageIOSurface2DCHROMIUM(
7586 GLenum target, GLsizei width, GLsizei height,
7587 GLuint io_surface_id, GLuint plane) {
7588 #if defined(OS_MACOSX)
7589 if (gfx::GetGLImplementation() != gfx::kGLImplementationDesktopGL) {
7590 SetGLError(GL_INVALID_OPERATION,
7591 "glTexImageIOSurface2DCHROMIUM: only supported on desktop GL.");
7592 return;
7593 }
7594
7595 IOSurfaceSupport* surface_support = IOSurfaceSupport::Initialize();
7596 if (!surface_support) {
7597 SetGLError(GL_INVALID_OPERATION,
7598 "glTexImageIOSurface2DCHROMIUM: only supported on 10.6.");
7599 return;
7600 }
7601
7602 if (target != GL_TEXTURE_RECTANGLE_ARB) {
7603 // This might be supported in the future, and if we could require
7604 // support for binding an IOSurface to a NPOT TEXTURE_2D texture, we
7605 // could delete a lot of code. For now, perform strict validation so we
7606 // know what's going on.
7607 SetGLError(
7608 GL_INVALID_OPERATION,
7609 "glTexImageIOSurface2DCHROMIUM: requires TEXTURE_RECTANGLE_ARB target");
7610 return;
7611 }
7612
7613 TextureManager::TextureInfo* info = GetTextureInfoForTarget(target);
7614 if (!info) {
7615 SetGLError(GL_INVALID_OPERATION,
7616 "glTexImageIOSurface2DCHROMIUM: no rectangle texture bound");
7617 return;
7618 }
7619 if (info == texture_manager()->GetDefaultTextureInfo(target)) {
greggman 2011/11/28 22:58:11 This check is not needed. GetTextureInfoForTarget
7620 // Maybe this is conceptually valid, but disallow it to avoid accidents.
7621 SetGLError(GL_INVALID_OPERATION,
7622 "glTexImageIOSurface2DCHROMIUM: can't bind default texture");
7623 return;
7624 }
7625
7626 // Look up the new IOSurface. Note that because of asynchrony
7627 // between processes this might fail; during live resizing the
7628 // plugin process might allocate and release an IOSurface before
7629 // this process gets a chance to look it up. Hold on to any old
7630 // IOSurface in this case.
7631 CFTypeRef surface = surface_support->IOSurfaceLookup(io_surface_id);
7632 if (!surface) {
7633 SetGLError(GL_INVALID_OPERATION,
7634 "glTexImageIOSurface2DCHROMIUM: no IOSurface with the given ID");
7635 return;
7636 }
7637
7638 // Release any IOSurface previously bound to this texture.
7639 ReleaseIOSurfaceForTexture(info->service_id());
7640
7641 // Make sure we release the IOSurface even if CGLTexImageIOSurface2D fails.
7642 texture_to_io_surface_map_.insert(
7643 std::make_pair(info->service_id(), surface));
7644
7645 CGLContextObj context =
7646 static_cast<CGLContextObj>(context_->GetHandle());
7647
7648 CGLError err = surface_support->CGLTexImageIOSurface2D(
7649 context,
7650 target,
7651 GL_RGBA,
7652 width,
7653 height,
7654 GL_BGRA,
7655 GL_UNSIGNED_INT_8_8_8_8_REV,
7656 surface,
7657 plane);
7658
7659 if (err != kCGLNoError) {
7660 SetGLError(
7661 GL_INVALID_OPERATION,
7662 "glTexImageIOSurface2DCHROMIUM: error in CGLTexImageIOSurface2D");
7663 return;
7664 }
7665
7666 texture_manager()->SetLevelInfo(
7667 feature_info_, info,
7668 target, 0, GL_RGBA, width, height, 1, 0,
7669 GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, true);
greggman 2011/11/28 22:58:11 Do you need to check in feature_info that GL_BGRA
7670
7671 #else
7672 SetGLError(GL_INVALID_OPERATION,
7673 "glTexImageIOSurface2DCHROMIUM: not supported.");
7674 #endif
7675 }
7676
7677
7489 // Include the auto-generated part of this file. We split this because it means 7678 // Include the auto-generated part of this file. We split this because it means
7490 // we can easily edit the non-auto generated parts right here in this file 7679 // we can easily edit the non-auto generated parts right here in this file
7491 // instead of having to edit some template or the code generator. 7680 // instead of having to edit some template or the code generator.
7492 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 7681 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
7493 7682
7494 } // namespace gles2 7683 } // namespace gles2
7495 } // namespace gpu 7684 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/feature_info.cc ('k') | gpu/command_buffer/service/gles2_cmd_decoder_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698