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

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

Issue 8515023: Allow deleted resources to be used (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 1 month 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>
(...skipping 548 matching lines...) Expand 10 before | Expand all | Expand 10 after
559 // glBindTexture 559 // glBindTexture
560 TextureManager::TextureInfo::Ref bound_texture_external_oes; 560 TextureManager::TextureInfo::Ref bound_texture_external_oes;
561 561
562 TextureManager::TextureInfo::Ref GetInfoForSamplerType(GLenum type) { 562 TextureManager::TextureInfo::Ref GetInfoForSamplerType(GLenum type) {
563 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || 563 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE ||
564 type == GL_SAMPLER_EXTERNAL_OES); 564 type == GL_SAMPLER_EXTERNAL_OES);
565 return type == GL_SAMPLER_2D ? bound_texture_2d : 565 return type == GL_SAMPLER_2D ? bound_texture_2d :
566 (type == GL_SAMPLER_EXTERNAL_OES ? bound_texture_external_oes : 566 (type == GL_SAMPLER_EXTERNAL_OES ? bound_texture_external_oes :
567 bound_texture_cube_map); 567 bound_texture_cube_map);
568 } 568 }
569
570 void Unbind(TextureManager::TextureInfo* texture) {
571 if (bound_texture_2d == texture) {
572 bound_texture_2d = NULL;
573 }
574 if (bound_texture_cube_map == texture) {
575 bound_texture_cube_map = NULL;
576 }
577 if (bound_texture_external_oes == texture) {
578 bound_texture_external_oes = NULL;
579 }
580 }
569 }; 581 };
570 582
571 // Initialize or re-initialize the shader translator. 583 // Initialize or re-initialize the shader translator.
572 bool InitializeShaderTranslator(); 584 bool InitializeShaderTranslator();
573 585
574 void UpdateCapabilities(); 586 void UpdateCapabilities();
575 587
576 // Helpers for the glGen and glDelete functions. 588 // Helpers for the glGen and glDelete functions.
577 bool GenTexturesHelper(GLsizei n, const GLuint* client_ids); 589 bool GenTexturesHelper(GLsizei n, const GLuint* client_ids);
578 void DeleteTexturesHelper(GLsizei n, const GLuint* client_ids); 590 void DeleteTexturesHelper(GLsizei n, const GLuint* client_ids);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 TextureManager::TextureInfo* CreateTextureInfo( 628 TextureManager::TextureInfo* CreateTextureInfo(
617 GLuint client_id, GLuint service_id) { 629 GLuint client_id, GLuint service_id) {
618 return texture_manager()->CreateTextureInfo( 630 return texture_manager()->CreateTextureInfo(
619 feature_info_, client_id, service_id); 631 feature_info_, client_id, service_id);
620 } 632 }
621 633
622 // Gets the texture info for the given texture. Returns NULL if none exists. 634 // Gets the texture info for the given texture. Returns NULL if none exists.
623 TextureManager::TextureInfo* GetTextureInfo(GLuint client_id) { 635 TextureManager::TextureInfo* GetTextureInfo(GLuint client_id) {
624 TextureManager::TextureInfo* info = 636 TextureManager::TextureInfo* info =
625 texture_manager()->GetTextureInfo(client_id); 637 texture_manager()->GetTextureInfo(client_id);
626 return (info && !info->IsDeleted()) ? info : NULL; 638 return info;
627 } 639 }
628 640
629 // Deletes the texture info for the given texture. 641 // Deletes the texture info for the given texture.
630 void RemoveTextureInfo(GLuint client_id) { 642 void RemoveTextureInfo(GLuint client_id) {
631 texture_manager()->RemoveTextureInfo(feature_info_, client_id); 643 texture_manager()->RemoveTextureInfo(feature_info_, client_id);
632 } 644 }
633 645
634 // Get the size (in pixels) of the currently bound frame buffer (either FBO 646 // Get the size (in pixels) of the currently bound frame buffer (either FBO
635 // or regular back buffer). 647 // or regular back buffer).
636 gfx::Size GetBoundReadFrameBufferSize(); 648 gfx::Size GetBoundReadFrameBufferSize();
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 787
776 // Creates a buffer info for the given buffer. 788 // Creates a buffer info for the given buffer.
777 void CreateBufferInfo(GLuint client_id, GLuint service_id) { 789 void CreateBufferInfo(GLuint client_id, GLuint service_id) {
778 return buffer_manager()->CreateBufferInfo(client_id, service_id); 790 return buffer_manager()->CreateBufferInfo(client_id, service_id);
779 } 791 }
780 792
781 // Gets the buffer info for the given buffer. 793 // Gets the buffer info for the given buffer.
782 BufferManager::BufferInfo* GetBufferInfo(GLuint client_id) { 794 BufferManager::BufferInfo* GetBufferInfo(GLuint client_id) {
783 BufferManager::BufferInfo* info = 795 BufferManager::BufferInfo* info =
784 buffer_manager()->GetBufferInfo(client_id); 796 buffer_manager()->GetBufferInfo(client_id);
785 return (info && !info->IsDeleted()) ? info : NULL; 797 return info;
786 } 798 }
787 799
788 // Removes any buffers in the VertexAtrribInfos and BufferInfos. This is used 800 // Removes any buffers in the VertexAtrribInfos and BufferInfos. This is used
789 // on glDeleteBuffers so we can make sure the user does not try to render 801 // on glDeleteBuffers so we can make sure the user does not try to render
790 // with deleted buffers. 802 // with deleted buffers.
791 void RemoveBufferInfo(GLuint client_id); 803 void RemoveBufferInfo(GLuint client_id);
792 804
793 // Creates a framebuffer info for the given framebuffer. 805 // Creates a framebuffer info for the given framebuffer.
794 void CreateFramebufferInfo(GLuint client_id, GLuint service_id) { 806 void CreateFramebufferInfo(GLuint client_id, GLuint service_id) {
795 return framebuffer_manager()->CreateFramebufferInfo(client_id, service_id); 807 return framebuffer_manager()->CreateFramebufferInfo(client_id, service_id);
796 } 808 }
797 809
798 // Gets the framebuffer info for the given framebuffer. 810 // Gets the framebuffer info for the given framebuffer.
799 FramebufferManager::FramebufferInfo* GetFramebufferInfo( 811 FramebufferManager::FramebufferInfo* GetFramebufferInfo(
800 GLuint client_id) { 812 GLuint client_id) {
801 FramebufferManager::FramebufferInfo* info = 813 FramebufferManager::FramebufferInfo* info =
802 framebuffer_manager()->GetFramebufferInfo(client_id); 814 framebuffer_manager()->GetFramebufferInfo(client_id);
803 return (info && !info->IsDeleted()) ? info : NULL; 815 return info;
804 } 816 }
805 817
806 // Removes the framebuffer info for the given framebuffer. 818 // Removes the framebuffer info for the given framebuffer.
807 void RemoveFramebufferInfo(GLuint client_id) { 819 void RemoveFramebufferInfo(GLuint client_id) {
808 framebuffer_manager()->RemoveFramebufferInfo(client_id); 820 framebuffer_manager()->RemoveFramebufferInfo(client_id);
809 } 821 }
810 822
811 // Creates a renderbuffer info for the given renderbuffer. 823 // Creates a renderbuffer info for the given renderbuffer.
812 void CreateRenderbufferInfo(GLuint client_id, GLuint service_id) { 824 void CreateRenderbufferInfo(GLuint client_id, GLuint service_id) {
813 return renderbuffer_manager()->CreateRenderbufferInfo( 825 return renderbuffer_manager()->CreateRenderbufferInfo(
814 client_id, service_id); 826 client_id, service_id);
815 } 827 }
816 828
817 // Gets the renderbuffer info for the given renderbuffer. 829 // Gets the renderbuffer info for the given renderbuffer.
818 RenderbufferManager::RenderbufferInfo* GetRenderbufferInfo( 830 RenderbufferManager::RenderbufferInfo* GetRenderbufferInfo(
819 GLuint client_id) { 831 GLuint client_id) {
820 RenderbufferManager::RenderbufferInfo* info = 832 RenderbufferManager::RenderbufferInfo* info =
821 renderbuffer_manager()->GetRenderbufferInfo(client_id); 833 renderbuffer_manager()->GetRenderbufferInfo(client_id);
822 return (info && !info->IsDeleted()) ? info : NULL; 834 return info;
823 } 835 }
824 836
825 // Removes the renderbuffer info for the given renderbuffer. 837 // Removes the renderbuffer info for the given renderbuffer.
826 void RemoveRenderbufferInfo(GLuint client_id) { 838 void RemoveRenderbufferInfo(GLuint client_id) {
827 renderbuffer_manager()->RemoveRenderbufferInfo(client_id); 839 renderbuffer_manager()->RemoveRenderbufferInfo(client_id);
828 } 840 }
829 841
830 void DoBindAttribLocation(GLuint client_id, GLuint index, const char* name); 842 void DoBindAttribLocation(GLuint client_id, GLuint index, const char* name);
831 843
832 error::Error GetAttribLocationHelper( 844 error::Error GetAttribLocationHelper(
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
1138 1150
1139 // Returns true if GL_FIXED attribs were simulated. 1151 // Returns true if GL_FIXED attribs were simulated.
1140 bool SimulateFixedAttribs(GLuint max_vertex_accessed, bool* simulated); 1152 bool SimulateFixedAttribs(GLuint max_vertex_accessed, bool* simulated);
1141 void RestoreStateForSimulatedFixedAttribs(); 1153 void RestoreStateForSimulatedFixedAttribs();
1142 1154
1143 // Gets the buffer id for a given target. 1155 // Gets the buffer id for a given target.
1144 BufferManager::BufferInfo* GetBufferInfoForTarget(GLenum target) { 1156 BufferManager::BufferInfo* GetBufferInfoForTarget(GLenum target) {
1145 DCHECK(target == GL_ARRAY_BUFFER || target == GL_ELEMENT_ARRAY_BUFFER); 1157 DCHECK(target == GL_ARRAY_BUFFER || target == GL_ELEMENT_ARRAY_BUFFER);
1146 BufferManager::BufferInfo* info = target == GL_ARRAY_BUFFER ? 1158 BufferManager::BufferInfo* info = target == GL_ARRAY_BUFFER ?
1147 bound_array_buffer_ : bound_element_array_buffer_; 1159 bound_array_buffer_ : bound_element_array_buffer_;
1148 return (info && !info->IsDeleted()) ? info : NULL; 1160 return info;
1149 } 1161 }
1150 1162
1151 // Gets the texture id for a given target. 1163 // Gets the texture id for a given target.
1152 TextureManager::TextureInfo* GetTextureInfoForTarget(GLenum target) { 1164 TextureManager::TextureInfo* GetTextureInfoForTarget(GLenum target) {
1153 TextureUnit& unit = texture_units_[active_texture_unit_]; 1165 TextureUnit& unit = texture_units_[active_texture_unit_];
1154 TextureManager::TextureInfo* info = NULL; 1166 TextureManager::TextureInfo* info = NULL;
1155 switch (target) { 1167 switch (target) {
1156 case GL_TEXTURE_2D: 1168 case GL_TEXTURE_2D:
1157 info = unit.bound_texture_2d; 1169 info = unit.bound_texture_2d;
1158 break; 1170 break;
(...skipping 10 matching lines...) Expand all
1169 info = unit.bound_texture_external_oes; 1181 info = unit.bound_texture_external_oes;
1170 break; 1182 break;
1171 // Note: If we ever support TEXTURE_RECTANGLE as a target, be sure to 1183 // Note: If we ever support TEXTURE_RECTANGLE as a target, be sure to
1172 // track |texture_| with the currently bound TEXTURE_RECTANGLE texture, 1184 // track |texture_| with the currently bound TEXTURE_RECTANGLE texture,
1173 // because |texture_| is used by the FBO rendering mechanism for readback 1185 // because |texture_| is used by the FBO rendering mechanism for readback
1174 // to the bits that get sent to the browser. 1186 // to the bits that get sent to the browser.
1175 default: 1187 default:
1176 NOTREACHED(); 1188 NOTREACHED();
1177 return NULL; 1189 return NULL;
1178 } 1190 }
1179 return (info && !info->IsDeleted()) ? info : NULL; 1191 return info;
1180 } 1192 }
1181 1193
1182 GLenum GetBindTargetForSamplerType(GLenum type) { 1194 GLenum GetBindTargetForSamplerType(GLenum type) {
1183 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE || 1195 DCHECK(type == GL_SAMPLER_2D || type == GL_SAMPLER_CUBE ||
1184 type == GL_SAMPLER_EXTERNAL_OES); 1196 type == GL_SAMPLER_EXTERNAL_OES);
1185 return type == GL_SAMPLER_2D ? GL_TEXTURE_2D : 1197 return type == GL_SAMPLER_2D ? GL_TEXTURE_2D :
1186 (type == GL_SAMPLER_EXTERNAL_OES ? GL_TEXTURE_EXTERNAL_OES : 1198 (type == GL_SAMPLER_EXTERNAL_OES ? GL_TEXTURE_EXTERNAL_OES :
1187 GL_TEXTURE_CUBE_MAP); 1199 GL_TEXTURE_CUBE_MAP);
1188 } 1200 }
1189 1201
1190 // Gets the framebuffer info for a particular target. 1202 // Gets the framebuffer info for a particular target.
1191 FramebufferManager::FramebufferInfo* GetFramebufferInfoForTarget( 1203 FramebufferManager::FramebufferInfo* GetFramebufferInfoForTarget(
1192 GLenum target) { 1204 GLenum target) {
1193 FramebufferManager::FramebufferInfo* info = NULL; 1205 FramebufferManager::FramebufferInfo* info = NULL;
1194 switch (target) { 1206 switch (target) {
1195 case GL_FRAMEBUFFER: 1207 case GL_FRAMEBUFFER:
1196 case GL_DRAW_FRAMEBUFFER: 1208 case GL_DRAW_FRAMEBUFFER:
1197 info = bound_draw_framebuffer_; 1209 info = bound_draw_framebuffer_;
1198 break; 1210 break;
1199 case GL_READ_FRAMEBUFFER: 1211 case GL_READ_FRAMEBUFFER:
1200 info = bound_read_framebuffer_; 1212 info = bound_read_framebuffer_;
1201 break; 1213 break;
1202 default: 1214 default:
1203 NOTREACHED(); 1215 NOTREACHED();
1204 break; 1216 break;
1205 } 1217 }
1206 return (info && !info->IsDeleted()) ? info : NULL; 1218 return info;
1207 } 1219 }
1208 1220
1209 RenderbufferManager::RenderbufferInfo* GetRenderbufferInfoForTarget( 1221 RenderbufferManager::RenderbufferInfo* GetRenderbufferInfoForTarget(
1210 GLenum target) { 1222 GLenum target) {
1211 RenderbufferManager::RenderbufferInfo* info = NULL; 1223 RenderbufferManager::RenderbufferInfo* info = NULL;
1212 switch (target) { 1224 switch (target) {
1213 case GL_RENDERBUFFER: 1225 case GL_RENDERBUFFER:
1214 info = bound_renderbuffer_; 1226 info = bound_renderbuffer_;
1215 break; 1227 break;
1216 default: 1228 default:
1217 NOTREACHED(); 1229 NOTREACHED();
1218 break; 1230 break;
1219 } 1231 }
1220 return (info && !info->IsDeleted()) ? info : NULL; 1232 return info;
1221 } 1233 }
1222 1234
1223 // Validates the program and location for a glGetUniform call and returns 1235 // Validates the program and location for a glGetUniform call and returns
1224 // a SizeResult setup to receive the result. Returns true if glGetUniform 1236 // a SizeResult setup to receive the result. Returns true if glGetUniform
1225 // should be called. 1237 // should be called.
1226 bool GetUniformSetup( 1238 bool GetUniformSetup(
1227 GLuint program, GLint location, 1239 GLuint program, GLint location,
1228 uint32 shm_id, uint32 shm_offset, 1240 uint32 shm_id, uint32 shm_offset,
1229 error::Error* error, GLuint* service_id, void** result, 1241 error::Error* error, GLuint* service_id, void** result,
1230 GLenum* result_type); 1242 GLenum* result_type);
(...skipping 948 matching lines...) Expand 10 before | Expand all | Expand 10 after
2179 glGenTextures(n, service_ids.get()); 2191 glGenTextures(n, service_ids.get());
2180 for (GLsizei ii = 0; ii < n; ++ii) { 2192 for (GLsizei ii = 0; ii < n; ++ii) {
2181 CreateTextureInfo(client_ids[ii], service_ids[ii]); 2193 CreateTextureInfo(client_ids[ii], service_ids[ii]);
2182 } 2194 }
2183 return true; 2195 return true;
2184 } 2196 }
2185 2197
2186 void GLES2DecoderImpl::DeleteBuffersHelper( 2198 void GLES2DecoderImpl::DeleteBuffersHelper(
2187 GLsizei n, const GLuint* client_ids) { 2199 GLsizei n, const GLuint* client_ids) {
2188 for (GLsizei ii = 0; ii < n; ++ii) { 2200 for (GLsizei ii = 0; ii < n; ++ii) {
2189 BufferManager::BufferInfo* info = GetBufferInfo(client_ids[ii]); 2201 BufferManager::BufferInfo* buffer = GetBufferInfo(client_ids[ii]);
2190 if (info) { 2202 if (buffer && !buffer->IsDeleted()) {
2191 GLuint service_id = info->service_id(); 2203 vertex_attrib_manager_.Unbind(buffer);
2204 if (bound_array_buffer_ == buffer) {
2205 bound_array_buffer_ = NULL;
2206 }
2207 if (bound_element_array_buffer_ == buffer) {
2208 bound_element_array_buffer_ = NULL;
2209 }
2210 GLuint service_id = buffer->service_id();
2192 glDeleteBuffersARB(1, &service_id); 2211 glDeleteBuffersARB(1, &service_id);
2193 RemoveBufferInfo(client_ids[ii]); 2212 RemoveBufferInfo(client_ids[ii]);
2194 } 2213 }
2195 } 2214 }
2196 } 2215 }
2197 2216
2198 void GLES2DecoderImpl::DeleteFramebuffersHelper( 2217 void GLES2DecoderImpl::DeleteFramebuffersHelper(
2199 GLsizei n, const GLuint* client_ids) { 2218 GLsizei n, const GLuint* client_ids) {
2200 bool supports_seperate_framebuffer_binds = 2219 bool supports_seperate_framebuffer_binds =
2201 feature_info_->feature_flags().chromium_framebuffer_multisample; 2220 feature_info_->feature_flags().chromium_framebuffer_multisample;
2202 2221
2203 for (GLsizei ii = 0; ii < n; ++ii) { 2222 for (GLsizei ii = 0; ii < n; ++ii) {
2204 FramebufferManager::FramebufferInfo* info = 2223 FramebufferManager::FramebufferInfo* framebuffer =
2205 GetFramebufferInfo(client_ids[ii]); 2224 GetFramebufferInfo(client_ids[ii]);
2206 if (info) { 2225 if (framebuffer && !framebuffer->IsDeleted()) {
2207 if (info == bound_draw_framebuffer_) { 2226 if (framebuffer == bound_draw_framebuffer_) {
2208 bound_draw_framebuffer_ = NULL; 2227 bound_draw_framebuffer_ = NULL;
2209 state_dirty_ = true; 2228 state_dirty_ = true;
2210 GLenum target = supports_seperate_framebuffer_binds ? 2229 GLenum target = supports_seperate_framebuffer_binds ?
2211 GL_DRAW_FRAMEBUFFER : GL_FRAMEBUFFER; 2230 GL_DRAW_FRAMEBUFFER : GL_FRAMEBUFFER;
2212 glBindFramebufferEXT(target, GetBackbufferServiceId()); 2231 glBindFramebufferEXT(target, GetBackbufferServiceId());
2213 } 2232 }
2214 if (info == bound_read_framebuffer_) { 2233 if (framebuffer == bound_read_framebuffer_) {
2215 bound_read_framebuffer_ = NULL; 2234 bound_read_framebuffer_ = NULL;
2216 GLenum target = supports_seperate_framebuffer_binds ? 2235 GLenum target = supports_seperate_framebuffer_binds ?
2217 GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER; 2236 GL_READ_FRAMEBUFFER : GL_FRAMEBUFFER;
2218 glBindFramebufferEXT(target, GetBackbufferServiceId()); 2237 glBindFramebufferEXT(target, GetBackbufferServiceId());
2219 } 2238 }
2220 GLuint service_id = info->service_id(); 2239 GLuint service_id = framebuffer->service_id();
2221 glDeleteFramebuffersEXT(1, &service_id); 2240 glDeleteFramebuffersEXT(1, &service_id);
2222 RemoveFramebufferInfo(client_ids[ii]); 2241 RemoveFramebufferInfo(client_ids[ii]);
2223 } 2242 }
2224 } 2243 }
2225 } 2244 }
2226 2245
2227 void GLES2DecoderImpl::DeleteRenderbuffersHelper( 2246 void GLES2DecoderImpl::DeleteRenderbuffersHelper(
2228 GLsizei n, const GLuint* client_ids) { 2247 GLsizei n, const GLuint* client_ids) {
2248 bool supports_seperate_framebuffer_binds =
2249 feature_info_->feature_flags().chromium_framebuffer_multisample;
2229 for (GLsizei ii = 0; ii < n; ++ii) { 2250 for (GLsizei ii = 0; ii < n; ++ii) {
2230 RenderbufferManager::RenderbufferInfo* info = 2251 RenderbufferManager::RenderbufferInfo* renderbuffer =
2231 GetRenderbufferInfo(client_ids[ii]); 2252 GetRenderbufferInfo(client_ids[ii]);
2232 if (info) { 2253 if (renderbuffer && !renderbuffer->IsDeleted()) {
2254 if (bound_renderbuffer_ == renderbuffer) {
2255 bound_renderbuffer_ = NULL;
2256 }
2257 // Unbind from current framebuffers.
2258 if (supports_seperate_framebuffer_binds) {
2259 if (bound_read_framebuffer_) {
2260 bound_read_framebuffer_->UnbindRenderbuffer(
2261 GL_READ_FRAMEBUFFER, renderbuffer);
2262 }
2263 if (bound_draw_framebuffer_) {
2264 bound_draw_framebuffer_->UnbindRenderbuffer(
2265 GL_DRAW_FRAMEBUFFER, renderbuffer);
2266 }
2267 } else {
2268 if (bound_draw_framebuffer_) {
2269 bound_draw_framebuffer_->UnbindRenderbuffer(
2270 GL_FRAMEBUFFER, renderbuffer);
2271 }
2272 }
2233 state_dirty_ = true; 2273 state_dirty_ = true;
2234 GLuint service_id = info->service_id(); 2274 GLuint service_id = renderbuffer->service_id();
2235 glDeleteRenderbuffersEXT(1, &service_id); 2275 glDeleteRenderbuffersEXT(1, &service_id);
2236 RemoveRenderbufferInfo(client_ids[ii]); 2276 RemoveRenderbufferInfo(client_ids[ii]);
2237 } 2277 }
2238 } 2278 }
2239 } 2279 }
2240 2280
2241 void GLES2DecoderImpl::DeleteTexturesHelper( 2281 void GLES2DecoderImpl::DeleteTexturesHelper(
2242 GLsizei n, const GLuint* client_ids) { 2282 GLsizei n, const GLuint* client_ids) {
2283 bool supports_seperate_framebuffer_binds =
2284 feature_info_->feature_flags().chromium_framebuffer_multisample;
2243 for (GLsizei ii = 0; ii < n; ++ii) { 2285 for (GLsizei ii = 0; ii < n; ++ii) {
2244 TextureManager::TextureInfo* info = GetTextureInfo(client_ids[ii]); 2286 TextureManager::TextureInfo* texture = GetTextureInfo(client_ids[ii]);
2245 if (info) { 2287 if (texture && !texture->IsDeleted()) {
2246 if (info->IsAttachedToFramebuffer()) { 2288 if (texture->IsAttachedToFramebuffer()) {
2247 state_dirty_ = true; 2289 state_dirty_ = true;
2248 } 2290 }
2249 GLuint service_id = info->service_id(); 2291 // Unbind texture from texture units.
2250 if (info->IsStreamTexture() && stream_texture_manager_) { 2292 for (size_t jj = 0; jj < group_->max_texture_units(); ++jj) {
2293 texture_units_[ii].Unbind(texture);
2294 }
2295 // Unbind from current framebuffers.
2296 if (supports_seperate_framebuffer_binds) {
2297 if (bound_read_framebuffer_) {
2298 bound_read_framebuffer_->UnbindTexture(GL_READ_FRAMEBUFFER, texture);
2299 }
2300 if (bound_draw_framebuffer_) {
2301 bound_draw_framebuffer_->UnbindTexture(GL_DRAW_FRAMEBUFFER, texture);
2302 }
2303 } else {
2304 if (bound_draw_framebuffer_) {
2305 bound_draw_framebuffer_->UnbindTexture(GL_FRAMEBUFFER, texture);
2306 }
2307 }
2308 GLuint service_id = texture->service_id();
2309 if (texture->IsStreamTexture() && stream_texture_manager_) {
2251 stream_texture_manager_->DestroyStreamTexture(service_id); 2310 stream_texture_manager_->DestroyStreamTexture(service_id);
2252 } 2311 }
2253 glDeleteTextures(1, &service_id); 2312 glDeleteTextures(1, &service_id);
2254 RemoveTextureInfo(client_ids[ii]); 2313 RemoveTextureInfo(client_ids[ii]);
2255 } 2314 }
2256 } 2315 }
2257 } 2316 }
2258 2317
2259 // } // anonymous namespace 2318 // } // anonymous namespace
2260 2319
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
2322 last_id = 0; 2381 last_id = 0;
2323 } 2382 }
2324 2383
2325 glBindTexture(GL_TEXTURE_2D, last_id); 2384 glBindTexture(GL_TEXTURE_2D, last_id);
2326 glActiveTexture(GL_TEXTURE0 + active_texture_unit_); 2385 glActiveTexture(GL_TEXTURE0 + active_texture_unit_);
2327 } 2386 }
2328 2387
2329 bool GLES2DecoderImpl::CheckFramebufferValid( 2388 bool GLES2DecoderImpl::CheckFramebufferValid(
2330 FramebufferManager::FramebufferInfo* framebuffer, 2389 FramebufferManager::FramebufferInfo* framebuffer,
2331 GLenum target, const char* func_name) { 2390 GLenum target, const char* func_name) {
2332 if (!framebuffer || framebuffer->IsDeleted()) { 2391 if (!framebuffer) {
2333 return true; 2392 return true;
2334 } 2393 }
2335 2394
2336 GLenum completeness = framebuffer->IsPossiblyComplete(); 2395 GLenum completeness = framebuffer->IsPossiblyComplete();
2337 if (completeness != GL_FRAMEBUFFER_COMPLETE) { 2396 if (completeness != GL_FRAMEBUFFER_COMPLETE) {
2338 SetGLError( 2397 SetGLError(
2339 GL_INVALID_FRAMEBUFFER_OPERATION, 2398 GL_INVALID_FRAMEBUFFER_OPERATION,
2340 (std::string(func_name) + " framebuffer incomplete").c_str()); 2399 (std::string(func_name) + " framebuffer incomplete").c_str());
2341 return false; 2400 return false;
2342 } 2401 }
(...skipping 1448 matching lines...) Expand 10 before | Expand all | Expand 10 after
3791 } 3850 }
3792 if (face == GL_BACK || face == GL_FRONT_AND_BACK) { 3851 if (face == GL_BACK || face == GL_FRONT_AND_BACK) {
3793 mask_stencil_back_ = mask; 3852 mask_stencil_back_ = mask;
3794 } 3853 }
3795 state_dirty_ = true; 3854 state_dirty_ = true;
3796 } 3855 }
3797 3856
3798 // Assumes framebuffer is complete. 3857 // Assumes framebuffer is complete.
3799 void GLES2DecoderImpl::ClearUnclearedAttachments( 3858 void GLES2DecoderImpl::ClearUnclearedAttachments(
3800 GLenum target, FramebufferManager::FramebufferInfo* info) { 3859 GLenum target, FramebufferManager::FramebufferInfo* info) {
3801 DCHECK(!info->IsDeleted());
3802 if (target == GL_READ_FRAMEBUFFER_EXT) { 3860 if (target == GL_READ_FRAMEBUFFER_EXT) {
3803 // bind this to the DRAW point, clear then bind back to READ 3861 // bind this to the DRAW point, clear then bind back to READ
3804 // TODO(gman): I don't think there is any guarantee that an FBO that 3862 // TODO(gman): I don't think there is any guarantee that an FBO that
3805 // is complete on the READ attachment will be complete as a DRAW 3863 // is complete on the READ attachment will be complete as a DRAW
3806 // attachment. 3864 // attachment.
3807 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0); 3865 glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0);
3808 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, info->service_id()); 3866 glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, info->service_id());
3809 } 3867 }
3810 GLbitfield clear_bits = 0; 3868 GLbitfield clear_bits = 0;
3811 if (info->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0)) { 3869 if (info->HasUnclearedAttachment(GL_COLOR_ATTACHMENT0)) {
(...skipping 745 matching lines...) Expand 10 before | Expand all | Expand 10 after
4557 current_program_->GetAttribInfoByLocation(info->index()); 4615 current_program_->GetAttribInfoByLocation(info->index());
4558 if (attrib_info) { 4616 if (attrib_info) {
4559 // This attrib is used in the current program. 4617 // This attrib is used in the current program.
4560 if (!info->CanAccess(max_vertex_accessed)) { 4618 if (!info->CanAccess(max_vertex_accessed)) {
4561 SetGLError(GL_INVALID_OPERATION, 4619 SetGLError(GL_INVALID_OPERATION,
4562 "glDrawXXX: attempt to access out of range vertices"); 4620 "glDrawXXX: attempt to access out of range vertices");
4563 return false; 4621 return false;
4564 } 4622 }
4565 } else { 4623 } else {
4566 // This attrib is not used in the current program. 4624 // This attrib is not used in the current program.
4567 if (!info->buffer() || info->buffer()->IsDeleted()) { 4625 if (!info->buffer()) {
4568 SetGLError( 4626 SetGLError(
4569 GL_INVALID_OPERATION, 4627 GL_INVALID_OPERATION,
4570 "glDrawXXX: attempt to render with no buffer attached to enabled " 4628 "glDrawXXX: attempt to render with no buffer attached to enabled "
4571 "attrib"); 4629 "attrib");
4572 return false; 4630 return false;
4573 } 4631 }
4574 } 4632 }
4575 } 4633 }
4576 return true; 4634 return true;
4577 } 4635 }
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
4810 if (WasContextLost()) { 4868 if (WasContextLost()) {
4811 LOG(ERROR) << " GLES2DecoderImpl: Context lost during DrawArrays."; 4869 LOG(ERROR) << " GLES2DecoderImpl: Context lost during DrawArrays.";
4812 return error::kLostContext; 4870 return error::kLostContext;
4813 } 4871 }
4814 } 4872 }
4815 return error::kNoError; 4873 return error::kNoError;
4816 } 4874 }
4817 4875
4818 error::Error GLES2DecoderImpl::HandleDrawElements( 4876 error::Error GLES2DecoderImpl::HandleDrawElements(
4819 uint32 immediate_data_size, const gles2::DrawElements& c) { 4877 uint32 immediate_data_size, const gles2::DrawElements& c) {
4820 if (!bound_element_array_buffer_ || 4878 if (!bound_element_array_buffer_) {
4821 bound_element_array_buffer_->IsDeleted()) {
4822 SetGLError(GL_INVALID_OPERATION, 4879 SetGLError(GL_INVALID_OPERATION,
4823 "glDrawElements: No element array buffer bound"); 4880 "glDrawElements: No element array buffer bound");
4824 return error::kNoError; 4881 return error::kNoError;
4825 } 4882 }
4826 4883
4827 GLenum mode = c.mode; 4884 GLenum mode = c.mode;
4828 GLsizei count = c.count; 4885 GLsizei count = c.count;
4829 GLenum type = c.type; 4886 GLenum type = c.type;
4830 int32 offset = c.index_offset; 4887 int32 offset = c.index_offset;
4831 if (count < 0) { 4888 if (count < 0) {
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
5110 shader, "glGetShaderInfoLog"); 5167 shader, "glGetShaderInfoLog");
5111 if (!info || !info->log_info()) { 5168 if (!info || !info->log_info()) {
5112 bucket->SetFromString(""); 5169 bucket->SetFromString("");
5113 return error::kNoError; 5170 return error::kNoError;
5114 } 5171 }
5115 bucket->SetFromString(info->log_info()->c_str()); 5172 bucket->SetFromString(info->log_info()->c_str());
5116 return error::kNoError; 5173 return error::kNoError;
5117 } 5174 }
5118 5175
5119 bool GLES2DecoderImpl::DoIsBuffer(GLuint client_id) { 5176 bool GLES2DecoderImpl::DoIsBuffer(GLuint client_id) {
5120 const BufferManager::BufferInfo* info = GetBufferInfo(client_id); 5177 const BufferManager::BufferInfo* buffer = GetBufferInfo(client_id);
5121 return info && info->IsValid(); 5178 return buffer && buffer->IsValid() && !buffer->IsDeleted();
5122 } 5179 }
5123 5180
5124 bool GLES2DecoderImpl::DoIsFramebuffer(GLuint client_id) { 5181 bool GLES2DecoderImpl::DoIsFramebuffer(GLuint client_id) {
5125 const FramebufferManager::FramebufferInfo* info = 5182 const FramebufferManager::FramebufferInfo* framebuffer =
5126 GetFramebufferInfo(client_id); 5183 GetFramebufferInfo(client_id);
5127 return info && info->IsValid(); 5184 return framebuffer && framebuffer->IsValid() && !framebuffer->IsDeleted();
5128 } 5185 }
5129 5186
5130 bool GLES2DecoderImpl::DoIsProgram(GLuint client_id) { 5187 bool GLES2DecoderImpl::DoIsProgram(GLuint client_id) {
5131 // IsProgram is true for programs as soon as they are created, until they are 5188 // IsProgram is true for programs as soon as they are created, until they are
5132 // deleted and no longer in use. 5189 // deleted and no longer in use.
5133 return GetProgramInfo(client_id) != NULL; 5190 const ProgramManager::ProgramInfo* program = GetProgramInfo(client_id);
5191 return program != NULL && !program->IsDeleted();
5134 } 5192 }
5135 5193
5136 bool GLES2DecoderImpl::DoIsRenderbuffer(GLuint client_id) { 5194 bool GLES2DecoderImpl::DoIsRenderbuffer(GLuint client_id) {
5137 const RenderbufferManager::RenderbufferInfo* info = 5195 const RenderbufferManager::RenderbufferInfo* renderbuffer =
5138 GetRenderbufferInfo(client_id); 5196 GetRenderbufferInfo(client_id);
5139 return info && info->IsValid(); 5197 return renderbuffer && renderbuffer->IsValid() && !renderbuffer->IsDeleted();
5140 } 5198 }
5141 5199
5142 bool GLES2DecoderImpl::DoIsShader(GLuint client_id) { 5200 bool GLES2DecoderImpl::DoIsShader(GLuint client_id) {
5143 // IsShader is true for shaders as soon as they are created, until they 5201 // IsShader is true for shaders as soon as they are created, until they
5144 // are deleted and not attached to any programs. 5202 // are deleted and not attached to any programs.
5145 return GetShaderInfo(client_id) != NULL; 5203 const ShaderManager::ShaderInfo* shader = GetShaderInfo(client_id);
5204 return shader != NULL && !shader->IsDeleted();
5146 } 5205 }
5147 5206
5148 bool GLES2DecoderImpl::DoIsTexture(GLuint client_id) { 5207 bool GLES2DecoderImpl::DoIsTexture(GLuint client_id) {
5149 const TextureManager::TextureInfo* info = GetTextureInfo(client_id); 5208 const TextureManager::TextureInfo* texture = GetTextureInfo(client_id);
5150 return info && info->IsValid(); 5209 return texture && texture->IsValid() && !texture->IsDeleted();
5151 } 5210 }
5152 5211
5153 void GLES2DecoderImpl::DoAttachShader( 5212 void GLES2DecoderImpl::DoAttachShader(
5154 GLuint program_client_id, GLint shader_client_id) { 5213 GLuint program_client_id, GLint shader_client_id) {
5155 ProgramManager::ProgramInfo* program_info = GetProgramInfoNotShader( 5214 ProgramManager::ProgramInfo* program_info = GetProgramInfoNotShader(
5156 program_client_id, "glAttachShader"); 5215 program_client_id, "glAttachShader");
5157 if (!program_info) { 5216 if (!program_info) {
5158 return; 5217 return;
5159 } 5218 }
5160 ShaderManager::ShaderInfo* shader_info = GetShaderInfoNotProgram( 5219 ShaderManager::ShaderInfo* shader_info = GetShaderInfoNotProgram(
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
5522 return error::kNoError; 5581 return error::kNoError;
5523 } 5582 }
5524 if (!validators_->pixel_type.IsValid(type)) { 5583 if (!validators_->pixel_type.IsValid(type)) {
5525 SetGLError(GL_INVALID_ENUM, "glReadPixels: type GL_INVALID_ENUM"); 5584 SetGLError(GL_INVALID_ENUM, "glReadPixels: type GL_INVALID_ENUM");
5526 return error::kNoError; 5585 return error::kNoError;
5527 } 5586 }
5528 if (width == 0 || height == 0) { 5587 if (width == 0 || height == 0) {
5529 return error::kNoError; 5588 return error::kNoError;
5530 } 5589 }
5531 5590
5532 CopyRealGLErrorsToWrapper();
5533
5534 ScopedResolvedFrameBufferBinder binder(this, false, true);
5535
5536 // Get the size of the current fbo or backbuffer. 5591 // Get the size of the current fbo or backbuffer.
5537 gfx::Size max_size = GetBoundReadFrameBufferSize(); 5592 gfx::Size max_size = GetBoundReadFrameBufferSize();
5538 5593
5539 GLint max_x; 5594 GLint max_x;
5540 GLint max_y; 5595 GLint max_y;
5541 if (!SafeAdd(x, width, &max_x) || !SafeAdd(y, height, &max_y)) { 5596 if (!SafeAdd(x, width, &max_x) || !SafeAdd(y, height, &max_y)) {
5542 SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions out of range"); 5597 SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions out of range");
5543 return error::kNoError; 5598 return error::kNoError;
5544 } 5599 }
5545 5600
5546 if (!CheckBoundFramebuffersValid("glReadPixels")) { 5601 if (!CheckBoundFramebuffersValid("glReadPixels")) {
5547 return error::kNoError; 5602 return error::kNoError;
5548 } 5603 }
5549 5604
5605 CopyRealGLErrorsToWrapper();
5606
5607 ScopedResolvedFrameBufferBinder binder(this, false, true);
5608
5550 if (x < 0 || y < 0 || max_x > max_size.width() || max_y > max_size.height()) { 5609 if (x < 0 || y < 0 || max_x > max_size.width() || max_y > max_size.height()) {
5551 // The user requested an out of range area. Get the results 1 line 5610 // The user requested an out of range area. Get the results 1 line
5552 // at a time. 5611 // at a time.
5553 uint32 temp_size; 5612 uint32 temp_size;
5554 if (!GLES2Util::ComputeImageDataSize( 5613 if (!GLES2Util::ComputeImageDataSize(
5555 width, 1, format, type, pack_alignment_, &temp_size)) { 5614 width, 1, format, type, pack_alignment_, &temp_size)) {
5556 SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions out of range"); 5615 SetGLError(GL_INVALID_VALUE, "glReadPixels: dimensions out of range");
5557 return error::kNoError; 5616 return error::kNoError;
5558 } 5617 }
5559 GLsizei unpadded_row_size = temp_size; 5618 GLsizei unpadded_row_size = temp_size;
(...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after
6380 // Check we have compatible formats. 6439 // Check we have compatible formats.
6381 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); 6440 GLenum read_format = GetBoundReadFrameBufferInternalFormat();
6382 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); 6441 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format);
6383 uint32 channels_needed = GLES2Util::GetChannelsForFormat(internal_format); 6442 uint32 channels_needed = GLES2Util::GetChannelsForFormat(internal_format);
6384 6443
6385 if ((channels_needed & channels_exist) != channels_needed) { 6444 if ((channels_needed & channels_exist) != channels_needed) {
6386 SetGLError(GL_INVALID_OPERATION, "glCopyTexImage2D: incompatible format"); 6445 SetGLError(GL_INVALID_OPERATION, "glCopyTexImage2D: incompatible format");
6387 return; 6446 return;
6388 } 6447 }
6389 6448
6449 if (!CheckBoundFramebuffersValid("glCopyTexImage2D")) {
6450 return;
6451 }
6452
6390 CopyRealGLErrorsToWrapper(); 6453 CopyRealGLErrorsToWrapper();
6391 ScopedResolvedFrameBufferBinder binder(this, false, true); 6454 ScopedResolvedFrameBufferBinder binder(this, false, true);
6392 gfx::Size size = GetBoundReadFrameBufferSize(); 6455 gfx::Size size = GetBoundReadFrameBufferSize();
6393 6456
6394 if (info->IsAttachedToFramebuffer()) { 6457 if (info->IsAttachedToFramebuffer()) {
6395 state_dirty_ = true; 6458 state_dirty_ = true;
6396 } 6459 }
6397 6460
6398 // Clip to size to source dimensions 6461 // Clip to size to source dimensions
6399 GLint copyX = 0; 6462 GLint copyX = 0;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
6464 GLenum read_format = GetBoundReadFrameBufferInternalFormat(); 6527 GLenum read_format = GetBoundReadFrameBufferInternalFormat();
6465 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format); 6528 uint32 channels_exist = GLES2Util::GetChannelsForFormat(read_format);
6466 uint32 channels_needed = GLES2Util::GetChannelsForFormat(format); 6529 uint32 channels_needed = GLES2Util::GetChannelsForFormat(format);
6467 6530
6468 if ((channels_needed & channels_exist) != channels_needed) { 6531 if ((channels_needed & channels_exist) != channels_needed) {
6469 SetGLError( 6532 SetGLError(
6470 GL_INVALID_OPERATION, "glCopyTexSubImage2D: incompatible format"); 6533 GL_INVALID_OPERATION, "glCopyTexSubImage2D: incompatible format");
6471 return; 6534 return;
6472 } 6535 }
6473 6536
6537 if (!CheckBoundFramebuffersValid("glCopyTexSubImage2D")) {
6538 return;
6539 }
6540
6474 ScopedResolvedFrameBufferBinder binder(this, false, true); 6541 ScopedResolvedFrameBufferBinder binder(this, false, true);
6475 gfx::Size size = GetBoundReadFrameBufferSize(); 6542 gfx::Size size = GetBoundReadFrameBufferSize();
6476 GLint copyX = 0; 6543 GLint copyX = 0;
6477 GLint copyY = 0; 6544 GLint copyY = 0;
6478 GLint copyWidth = 0; 6545 GLint copyWidth = 0;
6479 GLint copyHeight = 0; 6546 GLint copyHeight = 0;
6480 Clip(x, width, size.width(), &copyX, &copyWidth); 6547 Clip(x, width, size.width(), &copyX, &copyWidth);
6481 Clip(y, height, size.height(), &copyY, &copyHeight); 6548 Clip(y, height, size.height(), &copyY, &copyHeight);
6482 6549
6483 if (!texture_manager()->ClearTextureLevel(this, info, target, level)) { 6550 if (!texture_manager()->ClearTextureLevel(this, info, target, level)) {
(...skipping 920 matching lines...) Expand 10 before | Expand all | Expand 10 after
7404 return error::kNoError; 7471 return error::kNoError;
7405 } 7472 }
7406 7473
7407 // Include the auto-generated part of this file. We split this because it means 7474 // Include the auto-generated part of this file. We split this because it means
7408 // we can easily edit the non-auto generated parts right here in this file 7475 // we can easily edit the non-auto generated parts right here in this file
7409 // instead of having to edit some template or the code generator. 7476 // instead of having to edit some template or the code generator.
7410 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 7477 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
7411 7478
7412 } // namespace gles2 7479 } // namespace gles2
7413 } // namespace gpu 7480 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/service/framebuffer_manager_unittest.cc ('k') | gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698