1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_DXGI_SWAP_CHAIN_IMAGE_BACKING_H_
#define GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_DXGI_SWAP_CHAIN_IMAGE_BACKING_H_
#include <windows.h>
#include <d3d11.h>
#include <dxgi1_2.h>
#include <wrl/client.h>
#include <utility>
#include "gpu/command_buffer/common/mailbox.h"
#include "gpu/command_buffer/service/shared_image/d3d_image_backing.h"
#include "gpu/command_buffer/service/shared_image/shared_image_backing.h"
#include "gpu/command_buffer/service/shared_image/shared_image_representation.h"
#include "third_party/skia/include/core/SkAlphaType.h"
#include "third_party/skia/include/gpu/ganesh/GrTypes.h"
#include "ui/gfx/color_space.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/gpu_fence.h"
#include "ui/gl/buildflags.h"
namespace gpu {
class D3DImageBacking;
class SharedContextState;
class SharedImageManager;
class MemoryTypeTracker;
class GPU_GLES2_EXPORT DXGISwapChainImageBacking
: public ClearTrackingSharedImageBacking {
public:
static std::unique_ptr<DXGISwapChainImageBacking> Create(
Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device,
const Mailbox& mailbox,
viz::SharedImageFormat format,
DXGI_FORMAT internal_format,
const gfx::Size& size,
const gfx::ColorSpace& color_space,
GrSurfaceOrigin surface_origin,
SkAlphaType alpha_type,
gpu::SharedImageUsageSet usage,
std::string debug_label);
DXGISwapChainImageBacking(const DXGISwapChainImageBacking&) = delete;
DXGISwapChainImageBacking& operator=(const DXGISwapChainImageBacking&) =
delete;
~DXGISwapChainImageBacking() override;
// SharedImageBacking implementation.
SharedImageBackingType GetType() const override;
void Update(std::unique_ptr<gfx::GpuFence> in_fence) override;
protected:
std::unique_ptr<OverlayImageRepresentation> ProduceOverlay(
SharedImageManager* manager,
MemoryTypeTracker* tracker) override;
std::unique_ptr<SkiaGaneshImageRepresentation> ProduceSkiaGanesh(
SharedImageManager* manager,
MemoryTypeTracker* tracker,
scoped_refptr<SharedContextState> context_state) override;
std::unique_ptr<SkiaGraphiteImageRepresentation> ProduceSkiaGraphite(
SharedImageManager* manager,
MemoryTypeTracker* tracker,
scoped_refptr<SharedContextState> context_state) override;
private:
DXGISwapChainImageBacking(
const Mailbox& mailbox,
viz::SharedImageFormat format,
const gfx::Size& size,
const gfx::ColorSpace& color_space,
GrSurfaceOrigin surface_origin,
SkAlphaType alpha_type,
gpu::SharedImageUsageSet usage,
std::string debug_label,
Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device,
Microsoft::WRL::ComPtr<IDXGISwapChain1> dxgi_swap_chain,
int buffers_need_alpha_initialization_count);
friend class DXGISwapChainOverlayImageRepresentation;
bool Present(bool should_synchronize_present_with_vblank);
std::optional<gl::DCLayerOverlayImage> GetDCLayerOverlayImage() {
return std::make_optional<gl::DCLayerOverlayImage>(size(),
dxgi_swap_chain_);
}
friend class SkiaGLImageRepresentationDXGISwapChain;
// Called by the Skia representation to indicate where it intends to draw.
bool DidBeginWriteAccess(const gfx::Rect& swap_rect);
friend class DawnRepresentationDXGISwapChain;
wgpu::Texture BeginAccessDawn(const wgpu::Device& device,
wgpu::TextureUsage usage,
wgpu::TextureUsage internal_usage,
const gfx::Rect& update_rect);
void EndAccessDawn(const wgpu::Device& device, wgpu::Texture texture);
std::optional<gfx::Rect> pending_swap_rect_;
Microsoft::WRL::ComPtr<ID3D11Device> d3d11_device_;
Microsoft::WRL::ComPtr<IDXGISwapChain1> dxgi_swap_chain_;
// Holds a gles2::TexturePassthrough and corresponding egl image.
scoped_refptr<D3DImageBacking::GLTextureHolder> gl_texture_holder_;
// SharedTextureMemory is created from DXGISwapChain's backbuffer texture.
// This |shared_texture_memory_| wraps the ComPtr<ID3D11Texture> instead of
// creating from a share HANDLE.
wgpu::SharedTextureMemory shared_texture_memory_;
wgpu::Texture cached_wgpu_texture_;
wgpu::TextureUsage cached_wgpu_texture_usage_ = wgpu::TextureUsage::None;
// Count of buffers in |dxgi_swap_chain_| that need to have their alpha
// channels be cleared to opaque before use. If positive at the start of write
// access, this count will be decremented and the back buffer cleared.
// This value should be initialized to 0 or the swap chain's buffer count. It
// assumes DXGI swap chains cycle through its buffers in order, so after
// calling present |buffer_count - 1| times, |GetBuffer(0)| will have referred
// to every buffer once.
int buffers_need_alpha_initialization_count_ = 0;
bool first_swap_ = true;
};
} // namespace gpu
#endif // GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_DXGI_SWAP_CHAIN_IMAGE_BACKING_H_
|