mirror of
https://github.com/libretro/ppsspp.git
synced 2025-03-03 06:06:35 +00:00
Minor naming and init cleanups in VulkanTexture
This commit is contained in:
parent
eb73cc23cd
commit
39bf5b1f55
@ -3,17 +3,17 @@
|
||||
#include "Common/Log.h"
|
||||
|
||||
void VulkanTexture::Wipe() {
|
||||
if (image) {
|
||||
vulkan_->Delete().QueueDeleteImage(image);
|
||||
if (image_) {
|
||||
vulkan_->Delete().QueueDeleteImage(image_);
|
||||
}
|
||||
if (view) {
|
||||
vulkan_->Delete().QueueDeleteImageView(view);
|
||||
if (view_) {
|
||||
vulkan_->Delete().QueueDeleteImageView(view_);
|
||||
}
|
||||
if (mem && !allocator_) {
|
||||
vulkan_->Delete().QueueDeleteDeviceMemory(mem);
|
||||
} else if (mem) {
|
||||
allocator_->Free(mem, offset_);
|
||||
mem = VK_NULL_HANDLE;
|
||||
if (mem_ && !allocator_) {
|
||||
vulkan_->Delete().QueueDeleteDeviceMemory(mem_);
|
||||
} else if (mem_) {
|
||||
allocator_->Free(mem_, offset_);
|
||||
mem_ = VK_NULL_HANDLE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -33,8 +33,8 @@ static bool IsDepthStencilFormat(VkFormat format) {
|
||||
bool VulkanTexture::CreateDirect(VkCommandBuffer cmd, int w, int h, int numMips, VkFormat format, VkImageLayout initialLayout, VkImageUsageFlags usage, const VkComponentMapping *mapping) {
|
||||
Wipe();
|
||||
|
||||
tex_width = w;
|
||||
tex_height = h;
|
||||
width_ = w;
|
||||
height_ = h;
|
||||
numMips_ = numMips;
|
||||
format_ = format;
|
||||
|
||||
@ -43,8 +43,8 @@ bool VulkanTexture::CreateDirect(VkCommandBuffer cmd, int w, int h, int numMips,
|
||||
VkImageCreateInfo image_create_info{ VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };
|
||||
image_create_info.imageType = VK_IMAGE_TYPE_2D;
|
||||
image_create_info.format = format_;
|
||||
image_create_info.extent.width = tex_width;
|
||||
image_create_info.extent.height = tex_height;
|
||||
image_create_info.extent.width = width_;
|
||||
image_create_info.extent.height = height_;
|
||||
image_create_info.extent.depth = 1;
|
||||
image_create_info.mipLevels = numMips;
|
||||
image_create_info.arrayLayers = 1;
|
||||
@ -58,17 +58,17 @@ bool VulkanTexture::CreateDirect(VkCommandBuffer cmd, int w, int h, int numMips,
|
||||
image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
|
||||
}
|
||||
|
||||
VkResult res = vkCreateImage(vulkan_->GetDevice(), &image_create_info, NULL, &image);
|
||||
VkResult res = vkCreateImage(vulkan_->GetDevice(), &image_create_info, NULL, &image_);
|
||||
if (res != VK_SUCCESS) {
|
||||
assert(res == VK_ERROR_OUT_OF_HOST_MEMORY || res == VK_ERROR_OUT_OF_DEVICE_MEMORY || res == VK_ERROR_TOO_MANY_OBJECTS);
|
||||
return false;
|
||||
}
|
||||
|
||||
VkMemoryRequirements mem_reqs{};
|
||||
vkGetImageMemoryRequirements(vulkan_->GetDevice(), image, &mem_reqs);
|
||||
vkGetImageMemoryRequirements(vulkan_->GetDevice(), image_, &mem_reqs);
|
||||
|
||||
if (allocator_) {
|
||||
offset_ = allocator_->Allocate(mem_reqs, &mem);
|
||||
offset_ = allocator_->Allocate(mem_reqs, &mem_);
|
||||
if (offset_ == VulkanDeviceAllocator::ALLOCATE_FAILED) {
|
||||
return false;
|
||||
}
|
||||
@ -81,7 +81,7 @@ bool VulkanTexture::CreateDirect(VkCommandBuffer cmd, int w, int h, int numMips,
|
||||
bool pass = vulkan_->MemoryTypeFromProperties(mem_reqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &mem_alloc.memoryTypeIndex);
|
||||
assert(pass);
|
||||
|
||||
res = vkAllocateMemory(vulkan_->GetDevice(), &mem_alloc, NULL, &mem);
|
||||
res = vkAllocateMemory(vulkan_->GetDevice(), &mem_alloc, NULL, &mem_);
|
||||
if (res != VK_SUCCESS) {
|
||||
_assert_msg_(G3D, res != VK_ERROR_TOO_MANY_OBJECTS, "Too many Vulkan memory objects!");
|
||||
assert(res == VK_ERROR_OUT_OF_HOST_MEMORY || res == VK_ERROR_OUT_OF_DEVICE_MEMORY || res == VK_ERROR_TOO_MANY_OBJECTS);
|
||||
@ -91,7 +91,7 @@ bool VulkanTexture::CreateDirect(VkCommandBuffer cmd, int w, int h, int numMips,
|
||||
offset_ = 0;
|
||||
}
|
||||
|
||||
res = vkBindImageMemory(vulkan_->GetDevice(), image, mem, offset_);
|
||||
res = vkBindImageMemory(vulkan_->GetDevice(), image_, mem_, offset_);
|
||||
if (res != VK_SUCCESS) {
|
||||
assert(res == VK_ERROR_OUT_OF_HOST_MEMORY || res == VK_ERROR_OUT_OF_DEVICE_MEMORY || res == VK_ERROR_TOO_MANY_OBJECTS);
|
||||
return false;
|
||||
@ -101,7 +101,7 @@ bool VulkanTexture::CreateDirect(VkCommandBuffer cmd, int w, int h, int numMips,
|
||||
if (initialLayout != VK_IMAGE_LAYOUT_UNDEFINED && initialLayout != VK_IMAGE_LAYOUT_PREINITIALIZED) {
|
||||
switch (initialLayout) {
|
||||
case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
|
||||
TransitionImageLayout2(cmd, image, 0, numMips, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
TransitionImageLayout2(cmd, image_, 0, numMips, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
0, VK_ACCESS_TRANSFER_WRITE_BIT);
|
||||
@ -116,7 +116,7 @@ bool VulkanTexture::CreateDirect(VkCommandBuffer cmd, int w, int h, int numMips,
|
||||
|
||||
// Create the view while we're at it.
|
||||
VkImageViewCreateInfo view_info{ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO };
|
||||
view_info.image = image;
|
||||
view_info.image = image_;
|
||||
view_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
|
||||
view_info.format = format_;
|
||||
if (mapping) {
|
||||
@ -133,7 +133,7 @@ bool VulkanTexture::CreateDirect(VkCommandBuffer cmd, int w, int h, int numMips,
|
||||
view_info.subresourceRange.baseArrayLayer = 0;
|
||||
view_info.subresourceRange.layerCount = 1;
|
||||
|
||||
res = vkCreateImageView(vulkan_->GetDevice(), &view_info, NULL, &view);
|
||||
res = vkCreateImageView(vulkan_->GetDevice(), &view_info, NULL, &view_);
|
||||
if (res != VK_SUCCESS) {
|
||||
assert(res == VK_ERROR_OUT_OF_HOST_MEMORY || res == VK_ERROR_OUT_OF_DEVICE_MEMORY || res == VK_ERROR_TOO_MANY_OBJECTS);
|
||||
return false;
|
||||
@ -154,7 +154,7 @@ void VulkanTexture::UploadMip(VkCommandBuffer cmd, int mip, int mipWidth, int mi
|
||||
copy_region.imageSubresource.baseArrayLayer = 0;
|
||||
copy_region.imageSubresource.layerCount = 1;
|
||||
|
||||
vkCmdCopyBufferToImage(cmd, buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©_region);
|
||||
vkCmdCopyBufferToImage(cmd, buffer, image_, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ©_region);
|
||||
}
|
||||
|
||||
void VulkanTexture::GenerateMip(VkCommandBuffer cmd, int mip) {
|
||||
@ -164,33 +164,33 @@ void VulkanTexture::GenerateMip(VkCommandBuffer cmd, int mip) {
|
||||
blit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
blit.srcSubresource.layerCount = 1;
|
||||
blit.srcSubresource.mipLevel = mip - 1;
|
||||
blit.srcOffsets[1].x = tex_width >> (mip - 1);
|
||||
blit.srcOffsets[1].y = tex_height >> (mip - 1);
|
||||
blit.srcOffsets[1].x = width_ >> (mip - 1);
|
||||
blit.srcOffsets[1].y = height_ >> (mip - 1);
|
||||
blit.srcOffsets[1].z = 1;
|
||||
|
||||
blit.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
|
||||
blit.dstSubresource.layerCount = 1;
|
||||
blit.dstSubresource.mipLevel = mip;
|
||||
blit.dstOffsets[1].x = tex_width >> mip;
|
||||
blit.dstOffsets[1].y = tex_height >> mip;
|
||||
blit.dstOffsets[1].x = width_ >> mip;
|
||||
blit.dstOffsets[1].y = height_ >> mip;
|
||||
blit.dstOffsets[1].z = 1;
|
||||
|
||||
TransitionImageLayout2(cmd, image, mip - 1, 1, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
TransitionImageLayout2(cmd, image_, mip - 1, 1, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_ACCESS_TRANSFER_WRITE_BIT, VK_ACCESS_TRANSFER_READ_BIT);
|
||||
|
||||
// Low-quality mipmap generation, but works okay.
|
||||
vkCmdBlitImage(cmd, image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit, VK_FILTER_LINEAR);
|
||||
vkCmdBlitImage(cmd, image_, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, image_, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blit, VK_FILTER_LINEAR);
|
||||
|
||||
TransitionImageLayout2(cmd, image, mip - 1, 1, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
TransitionImageLayout2(cmd, image_, mip - 1, 1, VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
|
||||
VK_ACCESS_TRANSFER_READ_BIT, VK_ACCESS_TRANSFER_WRITE_BIT);
|
||||
}
|
||||
|
||||
void VulkanTexture::EndCreate(VkCommandBuffer cmd, bool vertexTexture) {
|
||||
TransitionImageLayout2(cmd, image, 0, 1,
|
||||
TransitionImageLayout2(cmd, image_, 0, 1,
|
||||
VK_IMAGE_ASPECT_COLOR_BIT,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
|
||||
VK_PIPELINE_STAGE_TRANSFER_BIT, vertexTexture ? VK_PIPELINE_STAGE_VERTEX_SHADER_BIT : VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
|
||||
@ -198,16 +198,16 @@ void VulkanTexture::EndCreate(VkCommandBuffer cmd, bool vertexTexture) {
|
||||
}
|
||||
|
||||
void VulkanTexture::Destroy() {
|
||||
if (view != VK_NULL_HANDLE) {
|
||||
vulkan_->Delete().QueueDeleteImageView(view);
|
||||
if (view_ != VK_NULL_HANDLE) {
|
||||
vulkan_->Delete().QueueDeleteImageView(view_);
|
||||
}
|
||||
if (image != VK_NULL_HANDLE) {
|
||||
vulkan_->Delete().QueueDeleteImage(image);
|
||||
if (image_ != VK_NULL_HANDLE) {
|
||||
vulkan_->Delete().QueueDeleteImage(image_);
|
||||
}
|
||||
if (mem != VK_NULL_HANDLE && !allocator_) {
|
||||
vulkan_->Delete().QueueDeleteDeviceMemory(mem);
|
||||
} else if (mem != VK_NULL_HANDLE) {
|
||||
allocator_->Free(mem, offset_);
|
||||
mem = VK_NULL_HANDLE;
|
||||
if (mem_ != VK_NULL_HANDLE && !allocator_) {
|
||||
vulkan_->Delete().QueueDeleteDeviceMemory(mem_);
|
||||
} else if (mem_ != VK_NULL_HANDLE) {
|
||||
allocator_->Free(mem_, offset_);
|
||||
mem_ = VK_NULL_HANDLE;
|
||||
}
|
||||
}
|
||||
|
@ -9,9 +9,7 @@ class VulkanDeviceAllocator;
|
||||
class VulkanTexture {
|
||||
public:
|
||||
VulkanTexture(VulkanContext *vulkan, VulkanDeviceAllocator *allocator)
|
||||
: vulkan_(vulkan), image(VK_NULL_HANDLE), mem(VK_NULL_HANDLE), view(VK_NULL_HANDLE),
|
||||
tex_width(0), tex_height(0), numMips_(1), format_(VK_FORMAT_UNDEFINED),
|
||||
allocator_(allocator), offset_(0) {
|
||||
: vulkan_(vulkan), allocator_(allocator) {
|
||||
}
|
||||
~VulkanTexture() {
|
||||
Destroy();
|
||||
@ -28,13 +26,13 @@ public:
|
||||
void Destroy();
|
||||
|
||||
// Used in image copies, etc.
|
||||
VkImage GetImage() const { return image; }
|
||||
VkImage GetImage() const { return image_; }
|
||||
|
||||
// Used for sampling, generally.
|
||||
VkImageView GetImageView() const { return view; }
|
||||
VkImageView GetImageView() const { return view_; }
|
||||
|
||||
int32_t GetWidth() const { return tex_width; }
|
||||
int32_t GetHeight() const { return tex_height; }
|
||||
int32_t GetWidth() const { return width_; }
|
||||
int32_t GetHeight() const { return height_; }
|
||||
int32_t GetNumMips() const { return numMips_; }
|
||||
VkFormat GetFormat() const { return format_; }
|
||||
|
||||
@ -42,11 +40,13 @@ private:
|
||||
void Wipe();
|
||||
|
||||
VulkanContext *vulkan_;
|
||||
VkImage image;
|
||||
VkImageView view;
|
||||
VkDeviceMemory mem;
|
||||
int32_t tex_width, tex_height, numMips_;
|
||||
VkFormat format_;
|
||||
VkImage image_ = VK_NULL_HANDLE;
|
||||
VkImageView view_ = VK_NULL_HANDLE;
|
||||
VkDeviceMemory mem_ = VK_NULL_HANDLE;
|
||||
int32_t width_ = 0;
|
||||
int32_t height_ = 0;
|
||||
int32_t numMips_ = 1;
|
||||
VkFormat format_ = VK_FORMAT_UNDEFINED;
|
||||
VulkanDeviceAllocator *allocator_;
|
||||
size_t offset_;
|
||||
size_t offset_ = 0;
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user