ULRE/src/SceneGraph/Vulkan/VKMemory.cpp

88 lines
1.9 KiB
C++
Raw Normal View History

#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKMemory.h>
#include<hgl/graph/VKPhysicalDevice.h>
VK_NAMESPACE_BEGIN
2020-10-21 12:39:22 +08:00
GPUMemory *GPUDevice::CreateMemory(const VkMemoryRequirements &req,uint32_t properties)
{
uint32_t index;
2019-11-25 22:05:05 +08:00
if(!attr->physical_device->CheckMemoryType(req.memoryTypeBits,properties,&index))
2020-01-23 21:00:35 +08:00
return(nullptr);
VkMemoryAllocateInfo alloc_info;
alloc_info.sType =VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
alloc_info.pNext =nullptr;
alloc_info.memoryTypeIndex =index;
alloc_info.allocationSize =req.size;
VkDeviceMemory memory;
2019-11-25 22:05:05 +08:00
if(vkAllocateMemory(attr->device,&alloc_info,nullptr,&memory)!=VK_SUCCESS)
return(nullptr);
2020-10-21 12:09:15 +08:00
return(new GPUMemory(attr->device,memory,req,index,properties));
}
2020-10-21 12:09:15 +08:00
GPUMemory::~GPUMemory()
{
vkFreeMemory(device,memory,nullptr);
}
2020-10-21 12:09:15 +08:00
void *GPUMemory::Map()
{
void *result;
if(vkMapMemory(device,memory,0,req.size,0,&result)==VK_SUCCESS)
return result;
return(nullptr);
}
2020-10-21 12:09:15 +08:00
void *GPUMemory::Map(const VkDeviceSize offset,const VkDeviceSize size)
{
if(offset<0||offset+size>=req.size)
return(nullptr);
void *result;
if(vkMapMemory(device,memory,0,size,0,&result)==VK_SUCCESS)
return result;
return(nullptr);
}
2020-10-21 12:09:15 +08:00
void GPUMemory::Unmap()
{
vkUnmapMemory(device,memory);
}
2020-10-21 12:09:15 +08:00
bool GPUMemory::Write(const void *ptr,VkDeviceSize start,VkDeviceSize size)
{
if(!ptr)return(false);
void *dst;
if(vkMapMemory(device,memory,start,size,0,&dst)!=VK_SUCCESS)
return(false);
memcpy(dst,ptr,size);
vkUnmapMemory(device,memory);
return(true);
}
2020-10-21 12:09:15 +08:00
bool GPUMemory::BindBuffer(VkBuffer buffer)
{
if(!buffer)return(false);
return(vkBindBufferMemory(device,buffer,memory,0)==VK_SUCCESS);
}
2020-10-21 12:09:15 +08:00
bool GPUMemory::BindImage(VkImage image)
{
if(!image)return(false);
return(vkBindImageMemory(device,image,memory,0)==VK_SUCCESS);
}
VK_NAMESPACE_END