Jelajahi Sumber

Vulkan: Fixing rendering to a 3D texture

BearishSun 9 tahun lalu
induk
melakukan
a05d30c98b

+ 1 - 1
Source/BansheeCore/Source/BsRenderTexture.cpp

@@ -48,7 +48,7 @@ namespace bs
 		{
 			mWidth = textureProps->getWidth();
 			mHeight = textureProps->getHeight();
-			mNumSlices = numSlices;
+			mNumSlices = textureProps->getDepth() * numSlices;
 			mColorDepth = bs::PixelUtil::getNumElemBits(textureProps->getFormat());
 			mHwGamma = textureProps->isHardwareGammaEnabled();
 			mMultisampleCount = textureProps->getNumSamples();

+ 1 - 1
Source/BansheeVulkanRenderAPI/Source/BsVulkanGpuParams.cpp

@@ -703,7 +703,7 @@ namespace bs
 				mParamInfo->getSetSlot(GpuPipelineParamInfo::ParamType::Texture, i, set, slot);
 
 				UINT32 bindingIdx = vkParamInfo.getBindingIdx(set, slot);
-				perDeviceData.perSetData[set].writeInfos[bindingIdx].image.imageView = resource->getView(false);;
+				perDeviceData.perSetData[set].writeInfos[bindingIdx].image.imageView = resource->getView(false);
 
 				mSetsDirty[set] = true;
 			}

+ 2 - 4
Source/BansheeVulkanRenderAPI/Source/BsVulkanRenderTexture.cpp

@@ -27,7 +27,7 @@ namespace bs
 		VULKAN_FRAMEBUFFER_DESC fbDesc;
 		fbDesc.width = mProperties.getWidth();
 		fbDesc.height = mProperties.getHeight();
-		fbDesc.layers = 1;
+		fbDesc.layers = mProperties.getNumSlices();
 		fbDesc.numSamples = mProperties.getMultisampleCount() > 1 ? mProperties.getMultisampleCount() : 1;
 		fbDesc.offscreen = true;
 
@@ -56,10 +56,9 @@ namespace bs
 					LOGERR("Cannot specify array slices when rendering to a 3D texture.");
 
 				surface.arraySlice = 0;
-				surface.numArraySlices = 1;
+				surface.numArraySlices = mProperties.getNumSlices();
 
 				fbDesc.color[i].baseLayer = 0;
-				fbDesc.layers = 1;
 			}
 			else
 			{
@@ -99,7 +98,6 @@ namespace bs
 					surface.numArraySlices = 1;
 
 					fbDesc.depth.baseLayer = 0;
-					fbDesc.layers = 1;
 				}
 				else
 				{

+ 21 - 8
Source/BansheeVulkanRenderAPI/Source/BsVulkanTexture.cpp

@@ -78,6 +78,23 @@ namespace bs
 		else
 			mMainView = createView(completeSurface, VK_IMAGE_ASPECT_COLOR_BIT);
 
+		ImageViewInfo mainViewInfo;
+		mainViewInfo.surface = completeSurface;
+		mainViewInfo.framebuffer = false;
+		mainViewInfo.view = mMainView;
+
+		mImageInfos.push_back(mainViewInfo);
+
+		if (mFramebufferMainView != VK_NULL_HANDLE)
+		{
+			ImageViewInfo fbMainViewInfo;
+			fbMainViewInfo.surface = completeSurface;
+			fbMainViewInfo.framebuffer = true;
+			fbMainViewInfo.view = mFramebufferMainView;
+
+			mImageInfos.push_back(fbMainViewInfo);
+		}
+
 		UINT32 numSubresources = mNumFaces * mNumMipLevels;
 		mSubresources = (VulkanImageSubresource**)bs_alloc(sizeof(VulkanImageSubresource*) * numSubresources);
 		for (UINT32 i = 0; i < numSubresources; i++)
@@ -97,11 +114,6 @@ namespace bs
 			mSubresources[i]->destroy();
 		}
 
-		vkDestroyImageView(vkDevice, mMainView, gVulkanAllocator);
-
-		if(mFramebufferMainView != VK_NULL_HANDLE)
-			vkDestroyImageView(vkDevice, mFramebufferMainView, gVulkanAllocator);
-
 		for(auto& entry : mImageInfos)
 			vkDestroyImageView(vkDevice, entry.view, gVulkanAllocator);
 
@@ -114,10 +126,10 @@ namespace bs
 
 	VkImageView VulkanImage::getView(bool framebuffer) const
 	{
-		if (!mIsDepthStencil || !framebuffer)
-			return mMainView;
+		if(framebuffer && mIsDepthStencil)
+			return mFramebufferMainView;
 
-		return mFramebufferMainView;
+		return mMainView;
 	}
 
 	VkImageView VulkanImage::getView(const TextureSurface& surface, bool framebuffer) const
@@ -170,6 +182,7 @@ namespace bs
 				mImageViewCI.viewType = VK_IMAGE_VIEW_TYPE_1D_ARRAY;
 				break;
 			case VK_IMAGE_VIEW_TYPE_2D:
+			case VK_IMAGE_VIEW_TYPE_3D:
 				mImageViewCI.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
 				break;
 			case VK_IMAGE_VIEW_TYPE_CUBE: