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

Side by Side Diff: gpu/command_buffer/client/gles2_implementation.cc

Issue 763383002: GPU: Flush in glBind* to avoid being executed after future glDelete* (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address a review issue Created 6 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
OLDNEW
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 <GLES2/gl2ext.h> 9 #include <GLES2/gl2ext.h>
10 #include <GLES2/gl2extchromium.h> 10 #include <GLES2/gl2extchromium.h>
(...skipping 2276 matching lines...) Expand 10 before | Expand all | Expand 10 after
2287 const GLuint* /* valuebuffers */) { 2287 const GLuint* /* valuebuffers */) {
2288 } 2288 }
2289 2289
2290 // NOTE #1: On old versions of OpenGL, calling glBindXXX with an unused id 2290 // NOTE #1: On old versions of OpenGL, calling glBindXXX with an unused id
2291 // generates a new resource. On newer versions of OpenGL they don't. The code 2291 // generates a new resource. On newer versions of OpenGL they don't. The code
2292 // related to binding below will need to change if we switch to the new OpenGL 2292 // related to binding below will need to change if we switch to the new OpenGL
2293 // model. Specifically it assumes a bind will succeed which is always true in 2293 // model. Specifically it assumes a bind will succeed which is always true in
2294 // the old model but possibly not true in the new model if another context has 2294 // the old model but possibly not true in the new model if another context has
2295 // deleted the resource. 2295 // deleted the resource.
2296 2296
2297 bool GLES2Implementation::BindBufferHelper( 2297 void GLES2Implementation::BindBufferHelper(
2298 GLenum target, GLuint buffer_id) { 2298 GLenum target, GLuint buffer_id) {
2299 // TODO(gman): See note #1 above. 2299 // TODO(gman): See note #1 above.
2300 bool changed = false; 2300 bool changed = false;
2301 switch (target) { 2301 switch (target) {
2302 case GL_ARRAY_BUFFER: 2302 case GL_ARRAY_BUFFER:
2303 if (bound_array_buffer_id_ != buffer_id) { 2303 if (bound_array_buffer_id_ != buffer_id) {
2304 bound_array_buffer_id_ = buffer_id; 2304 bound_array_buffer_id_ = buffer_id;
2305 changed = true; 2305 changed = true;
2306 } 2306 }
2307 break; 2307 break;
2308 case GL_ELEMENT_ARRAY_BUFFER: 2308 case GL_ELEMENT_ARRAY_BUFFER:
2309 changed = vertex_array_object_manager_->BindElementArray(buffer_id); 2309 changed = vertex_array_object_manager_->BindElementArray(buffer_id);
2310 break; 2310 break;
2311 case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM: 2311 case GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM:
2312 bound_pixel_pack_transfer_buffer_id_ = buffer_id; 2312 bound_pixel_pack_transfer_buffer_id_ = buffer_id;
2313 break; 2313 break;
2314 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM: 2314 case GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM:
2315 bound_pixel_unpack_transfer_buffer_id_ = buffer_id; 2315 bound_pixel_unpack_transfer_buffer_id_ = buffer_id;
2316 break; 2316 break;
2317 default: 2317 default:
2318 changed = true; 2318 changed = true;
2319 break; 2319 break;
2320 } 2320 }
2321 // TODO(gman): There's a bug here. If the target is invalid the ID will not be 2321 // TODO(gman): There's a bug here. If the target is invalid the ID will not be
2322 // used even though it's marked it as used here. 2322 // used even though it's marked it as used here.
2323 GetIdHandler(id_namespaces::kBuffers)->MarkAsUsedForBind(buffer_id); 2323 if (changed) {
2324 return changed; 2324 GetIdHandler(id_namespaces::kBuffers)->MarkAsUsedForBind(
2325 this, target, buffer_id, &GLES2Implementation::BindBufferStub);
2326 }
2325 } 2327 }
2326 2328
2327 bool GLES2Implementation::BindFramebufferHelper( 2329 void GLES2Implementation::BindBufferStub(GLenum target, GLuint buffer) {
2330 helper_->BindBuffer(target, buffer);
2331 if (share_group_->bind_generates_resource())
2332 helper_->CommandBufferHelper::Flush();
2333 }
2334
2335 void GLES2Implementation::BindFramebufferHelper(
2328 GLenum target, GLuint framebuffer) { 2336 GLenum target, GLuint framebuffer) {
2329 // TODO(gman): See note #1 above. 2337 // TODO(gman): See note #1 above.
2330 bool changed = false; 2338 bool changed = false;
2331 switch (target) { 2339 switch (target) {
2332 case GL_FRAMEBUFFER: 2340 case GL_FRAMEBUFFER:
2333 if (bound_framebuffer_ != framebuffer || 2341 if (bound_framebuffer_ != framebuffer ||
2334 bound_read_framebuffer_ != framebuffer) { 2342 bound_read_framebuffer_ != framebuffer) {
2335 bound_framebuffer_ = framebuffer; 2343 bound_framebuffer_ = framebuffer;
2336 bound_read_framebuffer_ = framebuffer; 2344 bound_read_framebuffer_ = framebuffer;
2337 changed = true; 2345 changed = true;
2338 } 2346 }
2339 break; 2347 break;
2340 case GL_READ_FRAMEBUFFER: 2348 case GL_READ_FRAMEBUFFER:
2341 if (!IsChromiumFramebufferMultisampleAvailable()) { 2349 if (!IsChromiumFramebufferMultisampleAvailable()) {
2342 SetGLErrorInvalidEnum("glBindFramebuffer", target, "target"); 2350 SetGLErrorInvalidEnum("glBindFramebuffer", target, "target");
2343 return false; 2351 return;
2344 } 2352 }
2345 if (bound_read_framebuffer_ != framebuffer) { 2353 if (bound_read_framebuffer_ != framebuffer) {
2346 bound_read_framebuffer_ = framebuffer; 2354 bound_read_framebuffer_ = framebuffer;
2347 changed = true; 2355 changed = true;
2348 } 2356 }
2349 break; 2357 break;
2350 case GL_DRAW_FRAMEBUFFER: 2358 case GL_DRAW_FRAMEBUFFER:
2351 if (!IsChromiumFramebufferMultisampleAvailable()) { 2359 if (!IsChromiumFramebufferMultisampleAvailable()) {
2352 SetGLErrorInvalidEnum("glBindFramebuffer", target, "target"); 2360 SetGLErrorInvalidEnum("glBindFramebuffer", target, "target");
2353 return false; 2361 return;
2354 } 2362 }
2355 if (bound_framebuffer_ != framebuffer) { 2363 if (bound_framebuffer_ != framebuffer) {
2356 bound_framebuffer_ = framebuffer; 2364 bound_framebuffer_ = framebuffer;
2357 changed = true; 2365 changed = true;
2358 } 2366 }
2359 break; 2367 break;
2360 default: 2368 default:
2361 SetGLErrorInvalidEnum("glBindFramebuffer", target, "target"); 2369 SetGLErrorInvalidEnum("glBindFramebuffer", target, "target");
2362 return false; 2370 return;
2363 } 2371 }
2364 GetIdHandler(id_namespaces::kFramebuffers)->MarkAsUsedForBind(framebuffer); 2372
2365 return changed; 2373 if (changed) {
2374 GetIdHandler(id_namespaces::kFramebuffers)->MarkAsUsedForBind(
2375 this, target, framebuffer, &GLES2Implementation::BindFramebufferStub);
2376 }
2366 } 2377 }
2367 2378
2368 bool GLES2Implementation::BindRenderbufferHelper( 2379 void GLES2Implementation::BindFramebufferStub(GLenum target,
2380 GLuint framebuffer) {
2381 helper_->BindFramebuffer(target, framebuffer);
2382 if (share_group_->bind_generates_resource())
2383 helper_->CommandBufferHelper::Flush();
2384 }
2385
2386 void GLES2Implementation::BindRenderbufferHelper(
2369 GLenum target, GLuint renderbuffer) { 2387 GLenum target, GLuint renderbuffer) {
2370 // TODO(gman): See note #1 above. 2388 // TODO(gman): See note #1 above.
2371 bool changed = false; 2389 bool changed = false;
2372 switch (target) { 2390 switch (target) {
2373 case GL_RENDERBUFFER: 2391 case GL_RENDERBUFFER:
2374 if (bound_renderbuffer_ != renderbuffer) { 2392 if (bound_renderbuffer_ != renderbuffer) {
2375 bound_renderbuffer_ = renderbuffer; 2393 bound_renderbuffer_ = renderbuffer;
2376 changed = true; 2394 changed = true;
2377 } 2395 }
2378 break; 2396 break;
2379 default: 2397 default:
2380 changed = true; 2398 changed = true;
2381 break; 2399 break;
2382 } 2400 }
2383 // TODO(gman): There's a bug here. If the target is invalid the ID will not be 2401 // TODO(gman): There's a bug here. If the target is invalid the ID will not be
2384 // used even though it's marked it as used here. 2402 // used even though it's marked it as used here.
2385 GetIdHandler(id_namespaces::kRenderbuffers)->MarkAsUsedForBind(renderbuffer); 2403 if (changed) {
2386 return changed; 2404 GetIdHandler(id_namespaces::kRenderbuffers)->MarkAsUsedForBind(
2405 this, target, renderbuffer,
2406 &GLES2Implementation::BindRenderbufferStub);
2407 }
2387 } 2408 }
2388 2409
2389 bool GLES2Implementation::BindTextureHelper(GLenum target, GLuint texture) { 2410 void GLES2Implementation::BindRenderbufferStub(GLenum target,
2411 GLuint renderbuffer) {
2412 helper_->BindRenderbuffer(target, renderbuffer);
2413 if (share_group_->bind_generates_resource())
2414 helper_->CommandBufferHelper::Flush();
2415 }
2416
2417 void GLES2Implementation::BindTextureHelper(GLenum target, GLuint texture) {
2390 // TODO(gman): See note #1 above. 2418 // TODO(gman): See note #1 above.
2391 // TODO(gman): Change this to false once we figure out why it's failing 2419 // TODO(gman): Change this to false once we figure out why it's failing
2392 // on daisy. 2420 // on daisy.
2393 bool changed = true; 2421 bool changed = true;
2394 TextureUnit& unit = texture_units_[active_texture_unit_]; 2422 TextureUnit& unit = texture_units_[active_texture_unit_];
2395 switch (target) { 2423 switch (target) {
2396 case GL_TEXTURE_2D: 2424 case GL_TEXTURE_2D:
2397 if (unit.bound_texture_2d != texture) { 2425 if (unit.bound_texture_2d != texture) {
2398 unit.bound_texture_2d = texture; 2426 unit.bound_texture_2d = texture;
2399 changed = true; 2427 changed = true;
(...skipping 10 matching lines...) Expand all
2410 unit.bound_texture_external_oes = texture; 2438 unit.bound_texture_external_oes = texture;
2411 changed = true; 2439 changed = true;
2412 } 2440 }
2413 break; 2441 break;
2414 default: 2442 default:
2415 changed = true; 2443 changed = true;
2416 break; 2444 break;
2417 } 2445 }
2418 // TODO(gman): There's a bug here. If the target is invalid the ID will not be 2446 // TODO(gman): There's a bug here. If the target is invalid the ID will not be
2419 // used. even though it's marked it as used here. 2447 // used. even though it's marked it as used here.
2420 GetIdHandler(id_namespaces::kTextures)->MarkAsUsedForBind(texture); 2448 if (changed) {
2421 return changed; 2449 GetIdHandler(id_namespaces::kTextures)->MarkAsUsedForBind(
2450 this, target, texture, &GLES2Implementation::BindTextureStub);
2451 }
2422 } 2452 }
2423 2453
2424 bool GLES2Implementation::BindVertexArrayOESHelper(GLuint array) { 2454 void GLES2Implementation::BindTextureStub(GLenum target, GLuint texture) {
2455 helper_->BindTexture(target, texture);
2456 if (share_group_->bind_generates_resource())
2457 helper_->CommandBufferHelper::Flush();
2458 }
2459
2460 void GLES2Implementation::BindVertexArrayOESHelper(GLuint array) {
2425 // TODO(gman): See note #1 above. 2461 // TODO(gman): See note #1 above.
2426 bool changed = false; 2462 bool changed = false;
2427 if (!vertex_array_object_manager_->BindVertexArray(array, &changed)) { 2463 if (vertex_array_object_manager_->BindVertexArray(array, &changed)) {
2464 if (changed) {
2465 // Unlike other BindXXXHelpers we don't call MarkAsUsedForBind
2466 // because unlike other resources VertexArrayObject ids must
2467 // be generated by GenVertexArrays. A random id to Bind will not
2468 // generate a new object.
2469 helper_->BindVertexArrayOES(array);
2470 }
2471 } else {
2428 SetGLError( 2472 SetGLError(
2429 GL_INVALID_OPERATION, "glBindVertexArrayOES", 2473 GL_INVALID_OPERATION, "glBindVertexArrayOES",
2430 "id was not generated with glGenVertexArrayOES"); 2474 "id was not generated with glGenVertexArrayOES");
2431 } 2475 }
2432 // Unlike other BindXXXHelpers we don't call MarkAsUsedForBind
2433 // because unlike other resources VertexArrayObject ids must
2434 // be generated by GenVertexArrays. A random id to Bind will not
2435 // generate a new object.
2436 return changed;
2437 } 2476 }
2438 2477
2439 bool GLES2Implementation::BindValuebufferCHROMIUMHelper(GLenum target, 2478 void GLES2Implementation::BindValuebufferCHROMIUMHelper(GLenum target,
2440 GLuint valuebuffer) { 2479 GLuint valuebuffer) {
2441 bool changed = false; 2480 bool changed = false;
2442 switch (target) { 2481 switch (target) {
2443 case GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM: 2482 case GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM:
2444 if (bound_valuebuffer_ != valuebuffer) { 2483 if (bound_valuebuffer_ != valuebuffer) {
2445 bound_valuebuffer_ = valuebuffer; 2484 bound_valuebuffer_ = valuebuffer;
2446 changed = true; 2485 changed = true;
2447 } 2486 }
2448 break; 2487 break;
2449 default: 2488 default:
2450 changed = true; 2489 changed = true;
2451 break; 2490 break;
2452 } 2491 }
2453 // TODO(gman): There's a bug here. If the target is invalid the ID will not be 2492 // TODO(gman): There's a bug here. If the target is invalid the ID will not be
2454 // used even though it's marked it as used here. 2493 // used even though it's marked it as used here.
2455 GetIdHandler(id_namespaces::kValuebuffers)->MarkAsUsedForBind(valuebuffer); 2494 if (changed) {
2456 return changed; 2495 GetIdHandler(id_namespaces::kValuebuffers)->MarkAsUsedForBind(
2496 this, target, valuebuffer,
2497 &GLES2Implementation::BindValuebufferCHROMIUMStub);
2498 }
2457 } 2499 }
2458 2500
2459 bool GLES2Implementation::UseProgramHelper(GLuint program) { 2501 void GLES2Implementation::BindValuebufferCHROMIUMStub(GLenum target,
2460 bool changed = false; 2502 GLuint valuebuffer) {
2503 helper_->BindValuebufferCHROMIUM(target, valuebuffer);
2504 if (share_group_->bind_generates_resource())
2505 helper_->CommandBufferHelper::Flush();
2506 }
2507
2508 void GLES2Implementation::UseProgramHelper(GLuint program) {
2461 if (current_program_ != program) { 2509 if (current_program_ != program) {
2462 current_program_ = program; 2510 current_program_ = program;
2463 changed = true; 2511 helper_->UseProgram(program);
2464 } 2512 }
2465 return changed;
2466 } 2513 }
2467 2514
2468 bool GLES2Implementation::IsBufferReservedId(GLuint id) { 2515 bool GLES2Implementation::IsBufferReservedId(GLuint id) {
2469 return vertex_array_object_manager_->IsReservedId(id); 2516 return vertex_array_object_manager_->IsReservedId(id);
2470 } 2517 }
2471 2518
2472 void GLES2Implementation::DeleteBuffersHelper( 2519 void GLES2Implementation::DeleteBuffersHelper(
2473 GLsizei n, const GLuint* buffers) { 2520 GLsizei n, const GLuint* buffers) {
2474 if (!GetIdHandler(id_namespaces::kBuffers)->FreeIds( 2521 if (!GetIdHandler(id_namespaces::kBuffers)->FreeIds(
2475 this, n, buffers, &GLES2Implementation::DeleteBuffersStub)) { 2522 this, n, buffers, &GLES2Implementation::DeleteBuffersStub)) {
(...skipping 1429 matching lines...) Expand 10 before | Expand all | Expand 10 after
3905 return true; 3952 return true;
3906 } 3953 }
3907 3954
3908 // Include the auto-generated part of this file. We split this because it means 3955 // Include the auto-generated part of this file. We split this because it means
3909 // we can easily edit the non-auto generated parts right here in this file 3956 // we can easily edit the non-auto generated parts right here in this file
3910 // instead of having to edit some template or the code generator. 3957 // instead of having to edit some template or the code generator.
3911 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h" 3958 #include "gpu/command_buffer/client/gles2_implementation_impl_autogen.h"
3912 3959
3913 } // namespace gles2 3960 } // namespace gles2
3914 } // namespace gpu 3961 } // namespace gpu
OLDNEW
« no previous file with comments | « gpu/command_buffer/client/gles2_implementation.h ('k') | gpu/command_buffer/client/gles2_implementation_impl_autogen.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698