Internal change
PiperOrigin-RevId: 481210917
This commit is contained in:
		
							parent
							
								
									e283c10970
								
							
						
					
					
						commit
						364b8e8106
					
				| 
						 | 
					@ -144,14 +144,23 @@ bool GlTextureBuffer::CreateInternal(const void* data, int alignment) {
 | 
				
			||||||
                        context](std::shared_ptr<GlSyncPoint> sync_token) {
 | 
					                        context](std::shared_ptr<GlSyncPoint> sync_token) {
 | 
				
			||||||
    CHECK_NE(name_, 0);
 | 
					    CHECK_NE(name_, 0);
 | 
				
			||||||
    GLuint name_to_delete = name_;
 | 
					    GLuint name_to_delete = name_;
 | 
				
			||||||
    context->RunWithoutWaiting([name_to_delete, sync_token]() {
 | 
					    context->RunWithoutWaiting([name_to_delete]() {
 | 
				
			||||||
      if (sync_token) {
 | 
					      // Note that we do not wait for consumers to be done before deleting the
 | 
				
			||||||
        // TODO: maybe we do not actually have to wait for the
 | 
					      // texture. Based on a reading of the GLES 3.0 spec, appendix D:
 | 
				
			||||||
        // consumer sync here. Check docs.
 | 
					      // - when a texture is deleted, it is _not_ automatically unbound from
 | 
				
			||||||
        sync_token->WaitOnGpu();
 | 
					      //   bind points in other contexts;
 | 
				
			||||||
      } else {
 | 
					      // - when a texture is deleted, its name becomes immediately invalid, but
 | 
				
			||||||
        LOG_FIRST_N(WARNING, 5) << "unexpected null sync in deletion_callback";
 | 
					      //   the actual object is not deleted until it is no longer in use, i.e.
 | 
				
			||||||
      }
 | 
					      //   attached to a container object or bound to a context;
 | 
				
			||||||
 | 
					      // - deleting an object is not an operation that changes its contents;
 | 
				
			||||||
 | 
					      // - within each context, commands are executed sequentially, so it seems
 | 
				
			||||||
 | 
					      //   like an unbind that follows a command that reads a texture should not
 | 
				
			||||||
 | 
					      //   take effect until the GPU has actually finished executing the
 | 
				
			||||||
 | 
					      //   previous commands.
 | 
				
			||||||
 | 
					      // The final point is the least explicit in the docs, but it is implied by
 | 
				
			||||||
 | 
					      // normal single-context behavior. E.g. if you do bind, delete, render,
 | 
				
			||||||
 | 
					      // unbind, the object is not deleted until the unbind, and it waits for
 | 
				
			||||||
 | 
					      // the render to finish.
 | 
				
			||||||
      DLOG_IF(ERROR, !glIsTexture(name_to_delete))
 | 
					      DLOG_IF(ERROR, !glIsTexture(name_to_delete))
 | 
				
			||||||
          << "Deleting invalid texture id: " << name_to_delete;
 | 
					          << "Deleting invalid texture id: " << name_to_delete;
 | 
				
			||||||
      glDeleteTextures(1, &name_to_delete);
 | 
					      glDeleteTextures(1, &name_to_delete);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user