/* * 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 GrVkMemory_DEFINED #define GrVkMemory_DEFINED #include "GrVkBuffer.h" #include "SkTArray.h" #include "vk/GrVkTypes.h" class GrVkGpu; namespace GrVkMemory { /** * Allocates vulkan device memory and binds it to the gpu's device for the given object. * Returns true if allocation succeeded. */ bool AllocAndBindBufferMemory(const GrVkGpu* gpu, VkBuffer buffer, GrVkBuffer::Type type, bool dynamic, GrVkAlloc* alloc); void FreeBufferMemory(const GrVkGpu* gpu, GrVkBuffer::Type type, const GrVkAlloc& alloc); bool AllocAndBindImageMemory(const GrVkGpu* gpu, VkImage image, bool linearTiling, GrVkAlloc* alloc); void FreeImageMemory(const GrVkGpu* gpu, bool linearTiling, const GrVkAlloc& alloc); // Maps the entire GrVkAlloc and returns a pointer to the start of the allocation. Underneath // the hood, we may map more than the range of the GrVkAlloc (e.g. the entire VkDeviceMemory), // but the pointer returned will always be to the start of the GrVkAlloc. The caller should also // never assume more than the GrVkAlloc block has been mapped. void* MapAlloc(const GrVkGpu* gpu, const GrVkAlloc& alloc); void UnmapAlloc(const GrVkGpu* gpu, const GrVkAlloc& alloc); // For the Flush and Invalidate calls, the offset should be relative to the GrVkAlloc. Thus this // will often be 0. The client does not need to make sure the offset and size are aligned to the // nonCoherentAtomSize, the internal calls will handle that. void FlushMappedAlloc(const GrVkGpu* gpu, const GrVkAlloc& alloc, VkDeviceSize offset, VkDeviceSize size); void InvalidateMappedAlloc(const GrVkGpu* gpu, const GrVkAlloc& alloc, VkDeviceSize offset, VkDeviceSize size); // Helper for aligning and setting VkMappedMemoryRange for flushing/invalidating noncoherent // memory. void GetNonCoherentMappedMemoryRange(const GrVkAlloc&, VkDeviceSize offset, VkDeviceSize size, VkDeviceSize alignment, VkMappedMemoryRange*); } #endif