blob: d734c2bc235cf6ffa0f6f483a00160cc9f0f8305 [file] [log] [blame]
/*
* Copyright 2016 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrVkTypes_DEFINED
#define GrVkTypes_DEFINED
#include "GrTypes.h"
#include "GrVkDefines.h"
/**
* KHR_debug
*/
/*typedef void (GR_GL_FUNCTION_TYPE* GrVkDEBUGPROC)(GrVkenum source,
GrVkenum type,
GrVkuint id,
GrVkenum severity,
GrVksizei length,
const GrVkchar* message,
const void* userParam);*/
///////////////////////////////////////////////////////////////////////////////
typedef intptr_t GrVkBackendMemory;
/**
* Types for interacting with Vulkan resources created externally to Skia. GrBackendObjects for
* Vulkan textures are really const GrVkImageInfo*
*/
struct GrVkAlloc {
GrVkAlloc()
: fMemory(VK_NULL_HANDLE)
, fOffset(0)
, fSize(0)
, fFlags(0)
, fBackendMemory(0)
, fUsesSystemHeap(false) {}
GrVkAlloc(VkDeviceMemory memory, VkDeviceSize offset, VkDeviceSize size, uint32_t flags)
: fMemory(memory)
, fOffset(offset)
, fSize(size)
, fFlags(flags)
, fBackendMemory(0)
, fUsesSystemHeap(false) {}
VkDeviceMemory fMemory; // can be VK_NULL_HANDLE iff is an RT and is borrowed
VkDeviceSize fOffset;
VkDeviceSize fSize; // this can be indeterminate iff Tex uses borrow semantics
uint32_t fFlags;
GrVkBackendMemory fBackendMemory; // handle to memory allocated via GrVkMemoryAllocator.
enum Flag {
kNoncoherent_Flag = 0x1, // memory must be flushed to device after mapping
kMappable_Flag = 0x2, // memory is able to be mapped.
};
bool operator==(const GrVkAlloc& that) const {
return fMemory == that.fMemory && fOffset == that.fOffset && fSize == that.fSize &&
fFlags == that.fFlags && fUsesSystemHeap == that.fUsesSystemHeap;
}
private:
friend class GrVkHeap; // For access to usesSystemHeap
bool fUsesSystemHeap;
};
struct GrVkImageInfo {
VkImage fImage;
GrVkAlloc fAlloc;
VkImageTiling fImageTiling;
VkImageLayout fImageLayout;
VkFormat fFormat;
uint32_t fLevelCount;
GrVkImageInfo()
: fImage(VK_NULL_HANDLE)
, fAlloc()
, fImageTiling(VK_IMAGE_TILING_OPTIMAL)
, fImageLayout(VK_IMAGE_LAYOUT_UNDEFINED)
, fFormat(VK_FORMAT_UNDEFINED)
, fLevelCount(0) {}
GrVkImageInfo(VkImage image, GrVkAlloc alloc, VkImageTiling imageTiling, VkImageLayout layout,
VkFormat format, uint32_t levelCount)
: fImage(image)
, fAlloc(alloc)
, fImageTiling(imageTiling)
, fImageLayout(layout)
, fFormat(format)
, fLevelCount(levelCount) {}
GrVkImageInfo(const GrVkImageInfo& info, VkImageLayout layout)
: fImage(info.fImage)
, fAlloc(info.fAlloc)
, fImageTiling(info.fImageTiling)
, fImageLayout(layout)
, fFormat(info.fFormat)
, fLevelCount(info.fLevelCount) {}
// This gives a way for a client to update the layout of the Image if they change the layout
// while we're still holding onto the wrapped texture. They will first need to get a handle
// to our internal GrVkImageInfo by calling getTextureHandle on a GrVkTexture.
void updateImageLayout(VkImageLayout layout) { fImageLayout = layout; }
bool operator==(const GrVkImageInfo& that) const {
return fImage == that.fImage && fAlloc == that.fAlloc &&
fImageTiling == that.fImageTiling && fImageLayout == that.fImageLayout &&
fFormat == that.fFormat && fLevelCount == that.fLevelCount;
}
};
#endif