Use utility framebuffer in ViewDoneWritingSimulatorWorkaround
This code needs a FBO to bind the texture. Fixes invalid results when running under simulator. PiperOrigin-RevId: 499241867
This commit is contained in:
		
							parent
							
								
									9252a025e5
								
							
						
					
					
						commit
						2f4bb5d545
					
				| 
						 | 
					@ -74,42 +74,51 @@ GlTextureView GpuBufferStorageCvPixelBuffer::GetReadView(
 | 
				
			||||||
static void ViewDoneWritingSimulatorWorkaround(CVPixelBufferRef pixel_buffer,
 | 
					static void ViewDoneWritingSimulatorWorkaround(CVPixelBufferRef pixel_buffer,
 | 
				
			||||||
                                               const GlTextureView& view) {
 | 
					                                               const GlTextureView& view) {
 | 
				
			||||||
  CHECK(pixel_buffer);
 | 
					  CHECK(pixel_buffer);
 | 
				
			||||||
  CVReturn err = CVPixelBufferLockBaseAddress(pixel_buffer, 0);
 | 
					  auto ctx = GlContext::GetCurrent().get();
 | 
				
			||||||
  CHECK(err == kCVReturnSuccess)
 | 
					  if (!ctx) ctx = view.gl_context();
 | 
				
			||||||
      << "CVPixelBufferLockBaseAddress failed: " << err;
 | 
					  ctx->Run([pixel_buffer, &view, ctx] {
 | 
				
			||||||
  OSType pixel_format = CVPixelBufferGetPixelFormatType(pixel_buffer);
 | 
					    CVReturn err = CVPixelBufferLockBaseAddress(pixel_buffer, 0);
 | 
				
			||||||
  size_t bytes_per_row = CVPixelBufferGetBytesPerRow(pixel_buffer);
 | 
					    CHECK(err == kCVReturnSuccess)
 | 
				
			||||||
  uint8_t* pixel_ptr =
 | 
					        << "CVPixelBufferLockBaseAddress failed: " << err;
 | 
				
			||||||
      static_cast<uint8_t*>(CVPixelBufferGetBaseAddress(pixel_buffer));
 | 
					    OSType pixel_format = CVPixelBufferGetPixelFormatType(pixel_buffer);
 | 
				
			||||||
  if (pixel_format == kCVPixelFormatType_32BGRA) {
 | 
					    size_t bytes_per_row = CVPixelBufferGetBytesPerRow(pixel_buffer);
 | 
				
			||||||
    // TODO: restore previous framebuffer? Move this to helper so we
 | 
					    uint8_t* pixel_ptr =
 | 
				
			||||||
    // can use BindFramebuffer?
 | 
					        static_cast<uint8_t*>(CVPixelBufferGetBaseAddress(pixel_buffer));
 | 
				
			||||||
    glViewport(0, 0, view.width(), view.height());
 | 
					    if (pixel_format == kCVPixelFormatType_32BGRA) {
 | 
				
			||||||
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, view.target(),
 | 
					      glBindFramebuffer(GL_FRAMEBUFFER, kUtilityFramebuffer.Get(*ctx));
 | 
				
			||||||
                           view.name(), 0);
 | 
					      glViewport(0, 0, view.width(), view.height());
 | 
				
			||||||
 | 
					      glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
 | 
				
			||||||
 | 
					                             view.target(), view.name(), 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    size_t contiguous_bytes_per_row = view.width() * 4;
 | 
					      size_t contiguous_bytes_per_row = view.width() * 4;
 | 
				
			||||||
    if (bytes_per_row == contiguous_bytes_per_row) {
 | 
					      if (bytes_per_row == contiguous_bytes_per_row) {
 | 
				
			||||||
      glReadPixels(0, 0, view.width(), view.height(), GL_BGRA, GL_UNSIGNED_BYTE,
 | 
					        glReadPixels(0, 0, view.width(), view.height(), GL_BGRA,
 | 
				
			||||||
                   pixel_ptr);
 | 
					                     GL_UNSIGNED_BYTE, pixel_ptr);
 | 
				
			||||||
    } else {
 | 
					      } else {
 | 
				
			||||||
      std::vector<uint8_t> contiguous_buffer(contiguous_bytes_per_row *
 | 
					        // TODO: use GL_PACK settings for row length. We can expect
 | 
				
			||||||
                                             view.height());
 | 
					        // GLES 3.0 on iOS now.
 | 
				
			||||||
      uint8_t* temp_ptr = contiguous_buffer.data();
 | 
					        std::vector<uint8_t> contiguous_buffer(contiguous_bytes_per_row *
 | 
				
			||||||
      glReadPixels(0, 0, view.width(), view.height(), GL_BGRA, GL_UNSIGNED_BYTE,
 | 
					                                               view.height());
 | 
				
			||||||
                   temp_ptr);
 | 
					        uint8_t* temp_ptr = contiguous_buffer.data();
 | 
				
			||||||
      for (int i = 0; i < view.height(); ++i) {
 | 
					        glReadPixels(0, 0, view.width(), view.height(), GL_BGRA,
 | 
				
			||||||
        memcpy(pixel_ptr, temp_ptr, contiguous_bytes_per_row);
 | 
					                     GL_UNSIGNED_BYTE, temp_ptr);
 | 
				
			||||||
        temp_ptr += contiguous_bytes_per_row;
 | 
					        for (int i = 0; i < view.height(); ++i) {
 | 
				
			||||||
        pixel_ptr += bytes_per_row;
 | 
					          memcpy(pixel_ptr, temp_ptr, contiguous_bytes_per_row);
 | 
				
			||||||
 | 
					          temp_ptr += contiguous_bytes_per_row;
 | 
				
			||||||
 | 
					          pixel_ptr += bytes_per_row;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					      // TODO: restore previous framebuffer?
 | 
				
			||||||
 | 
					      glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
 | 
				
			||||||
 | 
					                             view.target(), 0, 0);
 | 
				
			||||||
 | 
					      glBindFramebuffer(GL_FRAMEBUFFER, 0);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      LOG(ERROR) << "unsupported pixel format: " << pixel_format;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } else {
 | 
					    err = CVPixelBufferUnlockBaseAddress(pixel_buffer, 0);
 | 
				
			||||||
    LOG(ERROR) << "unsupported pixel format: " << pixel_format;
 | 
					    CHECK(err == kCVReturnSuccess)
 | 
				
			||||||
  }
 | 
					        << "CVPixelBufferUnlockBaseAddress failed: " << err;
 | 
				
			||||||
  err = CVPixelBufferUnlockBaseAddress(pixel_buffer, 0);
 | 
					  });
 | 
				
			||||||
  CHECK(err == kCVReturnSuccess)
 | 
					 | 
				
			||||||
      << "CVPixelBufferUnlockBaseAddress failed: " << err;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif  // TARGET_IPHONE_SIMULATOR
 | 
					#endif  // TARGET_IPHONE_SIMULATOR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user