blob: f8c08e6b98dbb03f67ce12122bf8cf8fb3ce423d [file] [log] [blame]
/*
* Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrVkRenderTarget_DEFINED
#define GrVkRenderTarget_DEFINED
#include "GrVkImage.h"
#include "GrRenderTarget.h"
#include "GrVkRenderPass.h"
class GrVkCommandBuffer;
class GrVkFramebuffer;
class GrVkGpu;
class GrVkImageView;
class GrVkStencilAttachment;
struct GrVkTextureInfo;
#ifdef SK_BUILD_FOR_WIN
// Windows gives bogus warnings about inheriting asTexture/asRenderTarget via dominance.
#pragma warning(push)
#pragma warning(disable: 4250)
#endif
class GrVkRenderTarget: public GrRenderTarget, public virtual GrVkImage {
public:
static GrVkRenderTarget* CreateNewRenderTarget(GrVkGpu*, const GrSurfaceDesc&,
GrGpuResource::LifeCycle,
const GrVkImage::ImageDesc&);
static GrVkRenderTarget* CreateWrappedRenderTarget(GrVkGpu*, const GrSurfaceDesc&,
GrGpuResource::LifeCycle,
const GrVkTextureInfo*);
~GrVkRenderTarget() override;
const GrVkFramebuffer* framebuffer() const { return fFramebuffer; }
const GrVkImageView* colorAttachmentView() const { return fColorAttachmentView; }
const GrVkImage::Resource* msaaImageResource() const { return fMSAAImageResource; }
const GrVkImageView* resolveAttachmentView() const { return fResolveAttachmentView; }
const GrVkImage::Resource* stencilImageResource() const;
const GrVkImageView* stencilAttachmentView() const;
const GrVkRenderPass* simpleRenderPass() const { return fCachedSimpleRenderPass; }
// override of GrRenderTarget
ResolveType getResolveType() const override {
return kCanResolve_ResolveType;
}
bool canAttemptStencilAttachment() const override {
return true;
}
GrBackendObject getRenderTargetHandle() const override;
// Returns the total number of attachments
void getAttachmentsDescriptor(GrVkRenderPass::AttachmentsDescriptor* desc,
GrVkRenderPass::AttachmentFlags* flags) const;
void addResources(GrVkCommandBuffer& commandBuffer) const;
protected:
enum Derived { kDerived };
GrVkRenderTarget(GrVkGpu* gpu,
const GrSurfaceDesc& desc,
GrGpuResource::LifeCycle,
const GrVkImage::Resource* imageResource,
const GrVkImage::Resource* msaaImageResource,
const GrVkImageView* colorAttachmentView,
const GrVkImageView* resolveAttachmentView);
GrVkRenderTarget(GrVkGpu* gpu,
const GrSurfaceDesc& desc,
GrGpuResource::LifeCycle,
const GrVkImage::Resource* imageResource,
const GrVkImage::Resource* msaaImageResource,
const GrVkImageView* colorAttachmentView,
const GrVkImageView* resolveAttachmentView,
Derived);
GrVkRenderTarget(GrVkGpu* gpu,
const GrSurfaceDesc& desc,
GrGpuResource::LifeCycle,
const GrVkImage::Resource* imageResource,
const GrVkImageView* colorAttachmentView);
GrVkRenderTarget(GrVkGpu* gpu,
const GrSurfaceDesc& desc,
GrGpuResource::LifeCycle,
const GrVkImage::Resource* imageResource,
const GrVkImageView* colorAttachmentView,
Derived);
static GrVkRenderTarget* Create(GrVkGpu*, const GrSurfaceDesc&,
GrGpuResource::LifeCycle,
const GrVkImage::Resource* imageResource);
GrVkGpu* getVkGpu() const;
void onAbandon() override;
void onRelease() override;
// This accounts for the texture's memory and any MSAA renderbuffer's memory.
size_t onGpuMemorySize() const override {
SkASSERT(kUnknown_GrPixelConfig != fDesc.fConfig);
SkASSERT(!GrPixelConfigIsCompressed(fDesc.fConfig));
size_t colorBytes = GrBytesPerPixel(fDesc.fConfig);
SkASSERT(colorBytes > 0);
return fColorValuesPerPixel * fDesc.fWidth * fDesc.fHeight * colorBytes;
}
private:
bool completeStencilAttachment() override;
void createFramebuffer(GrVkGpu* gpu);
void releaseInternalObjects();
void abandonInternalObjects();
const GrVkFramebuffer* fFramebuffer;
const GrVkImageView* fColorAttachmentView;
const GrVkImage::Resource* fMSAAImageResource;
const GrVkImageView* fResolveAttachmentView;
int fColorValuesPerPixel;
// This is a cached pointer to a simple render pass. The render target should unref it
// once it is done with it.
const GrVkRenderPass* fCachedSimpleRenderPass;
};
#endif