Index: content/common/gpu/gpu_command_buffer_stub.cc |
diff --git a/content/common/gpu/gpu_command_buffer_stub.cc b/content/common/gpu/gpu_command_buffer_stub.cc |
index e14cf986092b9c8817dcd3024e2474890734c368..4aaaa728c41beb9118227d580e22596d4d53dc03 100644 |
--- a/content/common/gpu/gpu_command_buffer_stub.cc |
+++ b/content/common/gpu/gpu_command_buffer_stub.cc |
@@ -940,11 +940,12 @@ void GpuCommandBufferStub::OnSetClientHasMemoryAllocationChangedCallback( |
} |
} |
-void GpuCommandBufferStub::OnCreateImage(int32 id, |
- gfx::GpuMemoryBufferHandle handle, |
- gfx::Size size, |
- gfx::GpuMemoryBuffer::Format format, |
- uint32 internalformat) { |
+void GpuCommandBufferStub::OnCreateImage( |
+ int32 id, |
+ std::vector<gfx::GpuMemoryBufferHandle> handles, |
+ gfx::Size size, |
+ std::vector<gfx::GpuMemoryBuffer::Format> formats, |
+ uint32 internalformat) { |
TRACE_EVENT0("gpu", "GpuCommandBufferStub::OnCreateImage"); |
if (!decoder_) |
@@ -957,26 +958,47 @@ void GpuCommandBufferStub::OnCreateImage(int32 id, |
return; |
} |
- if (!gpu::ImageFactory::IsGpuMemoryBufferFormatSupported( |
- format, decoder_->GetCapabilities())) { |
- LOG(ERROR) << "Format is not supported."; |
+ if (!gpu::ImageFactory::IsImageFormatSupported(internalformat)) { |
+ LOG(ERROR) << "Internalformat is not supported."; |
return; |
} |
- if (!gpu::ImageFactory::IsImageSizeValidForGpuMemoryBufferFormat(size, |
- format)) { |
- LOG(ERROR) << "Invalid image size for format."; |
+ size_t num_buffers = |
+ gpu::ImageFactory::NumberOfPlanesForImageFormat(internalformat); |
+ |
+ // Checks to make sure that the input isn't coming from a malicious renderer. |
+ if (handles.size() != num_buffers) { |
+ LOG(ERROR) << "Invalid number of GpuMemoryBufferHandle given for " |
+ "internalformat."; |
return; |
} |
- |
- if (!gpu::ImageFactory::IsImageFormatCompatibleWithGpuMemoryBufferFormat( |
- internalformat, format)) { |
- LOG(ERROR) << "Incompatible image format."; |
+ if (formats.size() != num_buffers) { |
+ LOG(ERROR) << "Invalid number of GpuMemoryBuffer::Format given for " |
+ "internalformat."; |
return; |
} |
- scoped_refptr<gfx::GLImage> image = channel()->CreateImageForGpuMemoryBuffer( |
- handle, size, format, internalformat); |
+ for (size_t i = 0; i < num_buffers; ++i) { |
+ const gfx::GpuMemoryBuffer::Format& format = formats[i]; |
+ if (!gpu::ImageFactory::IsGpuMemoryBufferFormatSupported( |
+ format, decoder_->GetCapabilities())) { |
+ LOG(ERROR) << "Format is not supported."; |
+ return; |
+ } |
+ if (!gpu::ImageFactory::IsImageSizeValidForGpuMemoryBufferFormat( |
+ size, format)) { |
+ LOG(ERROR) << "Invalid image size for format."; |
+ return; |
+ } |
+ if (!gpu::ImageFactory::IsImageFormatCompatibleWithGpuMemoryBufferFormat( |
+ internalformat, i, format)) { |
+ LOG(ERROR) << "Incompatible image format."; |
+ return; |
+ } |
+ } |
+ |
+ scoped_refptr<gfx::GLImage> image = channel()->CreateImageForGpuMemoryBuffers( |
+ handles, size, formats, internalformat); |
if (!image.get()) |
return; |