blob: e72064d87fff4e30a993e3bb877eee61c6ce58eb [file] [log] [blame]
// Copyright 2019 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_TEST_IMAGE_BACKING_H_
#define GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_TEST_IMAGE_BACKING_H_
#include "base/memory/raw_ptr.h"
#include "gpu/command_buffer/common/shared_image_usage.h"
#include "gpu/command_buffer/service/shared_image/shared_image_backing.h"
#include "gpu/command_buffer/service/texture_manager.h"
namespace gpu {
// Test implementation of a gles2::Texture backed backing.
class TestImageBacking : public SharedImageBacking {
public:
// Constructor which uses a dummy GL texture ID for the backing.
TestImageBacking(const Mailbox& mailbox,
viz::SharedImageFormat format,
const gfx::Size& size,
const gfx::ColorSpace& color_space,
GrSurfaceOrigin surface_origin,
SkAlphaType alpha_type,
SharedImageUsageSet usage,
size_t estimated_size);
// Constructor which uses a provided GL texture ID for the backing.
TestImageBacking(const Mailbox& mailbox,
viz::SharedImageFormat format,
const gfx::Size& size,
const gfx::ColorSpace& color_space,
GrSurfaceOrigin surface_origin,
SkAlphaType alpha_type,
SharedImageUsageSet usage,
size_t estimated_size,
GLuint texture_id);
~TestImageBacking() override;
bool GetUploadFromMemoryCalledAndReset();
bool GetReadbackToMemoryCalledAndReset();
using PurgeableCallback = base::RepeatingCallback<void(const gpu::Mailbox&)>;
void SetPurgeableCallbacks(
const PurgeableCallback& set_purgeable_callback,
const PurgeableCallback& set_not_purgeable_callback) {
set_purgeable_callback_ = set_purgeable_callback;
set_not_purgeable_callback_ = set_not_purgeable_callback;
}
// SharedImageBacking implementation.
SharedImageBackingType GetType() const override;
gfx::Rect ClearedRect() const override;
void SetClearedRect(const gfx::Rect& cleared_rect) override;
void SetPurgeable(bool purgeable) override;
void Update(std::unique_ptr<gfx::GpuFence> in_fence) override {}
bool UploadFromMemory(const std::vector<SkPixmap>& pixmap) override;
bool ReadbackToMemory(const std::vector<SkPixmap>& pixmaps) override;
// Helper functions
// Return the service ID of the first texture in the backing.
GLuint service_id() const { return textures_[0]->service_id(); }
void set_can_access(bool can_access) { can_access_ = can_access; }
bool can_access() const { return can_access_; }
#if BUILDFLAG(IS_APPLE)
void set_in_use_by_window_server(bool in_use_by_window_server) {
in_use_by_window_server_ = in_use_by_window_server;
}
bool in_use_by_window_server() const { return in_use_by_window_server_; }
#endif // BUILDFLAG(IS_APPLE)
protected:
std::unique_ptr<GLTextureImageRepresentation> ProduceGLTexture(
SharedImageManager* manager,
MemoryTypeTracker* tracker) override;
std::unique_ptr<GLTexturePassthroughImageRepresentation>
ProduceGLTexturePassthrough(SharedImageManager* manager,
MemoryTypeTracker* tracker) override;
// ProduceSkiaGanesh creates a representation that is backed by |textures_|,
// which allows for the creation of SkImages from the representation.
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;
// ProduceDawn/Overlay all create dummy representations that
// don't link up to a real texture.
std::unique_ptr<DawnImageRepresentation> ProduceDawn(
SharedImageManager* manager,
MemoryTypeTracker* tracker,
const wgpu::Device& device,
wgpu::BackendType backend_type,
std::vector<wgpu::TextureFormat> view_formats,
scoped_refptr<SharedContextState> context_state) override;
std::unique_ptr<OverlayImageRepresentation> ProduceOverlay(
SharedImageManager* manager,
MemoryTypeTracker* tracker) override;
private:
std::vector<raw_ptr<gles2::Texture>> textures_;
std::vector<scoped_refptr<gles2::TexturePassthrough>> passthrough_textures_;
bool can_access_ = true;
#if BUILDFLAG(IS_APPLE)
bool in_use_by_window_server_ = false;
#endif
bool upload_from_memory_called_ = false;
bool readback_to_memory_called_ = false;
PurgeableCallback set_purgeable_callback_;
PurgeableCallback set_not_purgeable_callback_;
};
class TestOverlayImageRepresentation : public OverlayImageRepresentation {
public:
TestOverlayImageRepresentation(SharedImageManager* manager,
SharedImageBacking* backing,
MemoryTypeTracker* tracker)
: OverlayImageRepresentation(manager, backing, tracker) {}
bool BeginReadAccess(gfx::GpuFenceHandle& acquire_fence) override;
void EndReadAccess(gfx::GpuFenceHandle release_fence) override;
#if BUILDFLAG(IS_ANDROID)
std::unique_ptr<base::android::ScopedHardwareBufferFenceSync>
GetAHardwareBufferFenceSync() override;
#endif
#if BUILDFLAG(IS_APPLE)
void MarkBackingInUse(bool in_use) {
static_cast<TestImageBacking*>(backing())->set_in_use_by_window_server(
in_use);
}
private:
bool IsInUseByWindowServer() const override;
#endif // BUILDFLAG(IS_APPLE)
};
} // namespace gpu
#endif // GPU_COMMAND_BUFFER_SERVICE_SHARED_IMAGE_TEST_IMAGE_BACKING_H_