1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-13 19:29:14 +01:00

[dxvk] Use float format for sampled unbound image views

Fixes validation errors in many cases if a texture is not bound.
This commit is contained in:
Philip Rebohle 2019-10-11 02:58:39 +02:00
parent e615416b31
commit 48b3b3ee85
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 57 additions and 32 deletions

View File

@ -3753,7 +3753,7 @@ namespace dxvk {
}
} else {
bindMask.clr(i);
descriptors[i].image = m_common->dummyResources().imageViewDescriptor(binding.view);
descriptors[i].image = m_common->dummyResources().imageViewDescriptor(binding.view, true);
} break;
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
@ -3771,7 +3771,7 @@ namespace dxvk {
}
} else {
bindMask.clr(i);
descriptors[i].image = m_common->dummyResources().imageViewDescriptor(binding.view);
descriptors[i].image = m_common->dummyResources().imageViewDescriptor(binding.view, false);
} break;
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:

View File

@ -9,13 +9,8 @@ namespace dxvk {
m_image1D (createImage(dev, VK_IMAGE_TYPE_1D, 1)),
m_image2D (createImage(dev, VK_IMAGE_TYPE_2D, 6)),
m_image3D (createImage(dev, VK_IMAGE_TYPE_3D, 1)),
m_view1D (createImageView(dev, m_image1D, VK_IMAGE_VIEW_TYPE_1D, 1)),
m_view1DArr (createImageView(dev, m_image1D, VK_IMAGE_VIEW_TYPE_1D_ARRAY, 1)),
m_view2D (createImageView(dev, m_image2D, VK_IMAGE_VIEW_TYPE_2D, 1)),
m_view2DArr (createImageView(dev, m_image2D, VK_IMAGE_VIEW_TYPE_2D_ARRAY, 1)),
m_viewCube (createImageView(dev, m_image2D, VK_IMAGE_VIEW_TYPE_CUBE, 6)),
m_viewCubeArr (createImageView(dev, m_image2D, VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, 6)),
m_view3D (createImageView(dev, m_image3D, VK_IMAGE_VIEW_TYPE_3D, 1)) {
m_viewsSampled (createImageViews(dev, VK_FORMAT_R32_SFLOAT)),
m_viewsStorage (createImageViews(dev, VK_FORMAT_R32_UINT)) {
}
@ -128,11 +123,12 @@ namespace dxvk {
Rc<DxvkImageView> DxvkUnboundResources::createImageView(
DxvkDevice* dev,
const Rc<DxvkImage>& image,
VkFormat format,
VkImageViewType type,
uint32_t layers) {
DxvkImageViewCreateInfo info;
info.type = type;
info.format = image->info().format;
info.format = format;
info.usage = VK_IMAGE_USAGE_SAMPLED_BIT
| VK_IMAGE_USAGE_STORAGE_BIT;
info.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
@ -148,16 +144,31 @@ namespace dxvk {
}
const DxvkImageView* DxvkUnboundResources::getImageView(VkImageViewType type) const {
DxvkUnboundResources::UnboundViews DxvkUnboundResources::createImageViews(DxvkDevice* dev, VkFormat format) {
UnboundViews result;
result.view1D = createImageView(dev, m_image1D, format, VK_IMAGE_VIEW_TYPE_1D, 1);
result.view1DArr = createImageView(dev, m_image1D, format, VK_IMAGE_VIEW_TYPE_1D_ARRAY, 1);
result.view2D = createImageView(dev, m_image2D, format, VK_IMAGE_VIEW_TYPE_2D, 1);
result.view2DArr = createImageView(dev, m_image2D, format, VK_IMAGE_VIEW_TYPE_2D_ARRAY, 1);
result.viewCube = createImageView(dev, m_image2D, format, VK_IMAGE_VIEW_TYPE_CUBE, 6);
result.viewCubeArr = createImageView(dev, m_image2D, format, VK_IMAGE_VIEW_TYPE_CUBE_ARRAY, 6);
result.view3D = createImageView(dev, m_image3D, format, VK_IMAGE_VIEW_TYPE_3D, 1);
return result;
}
const DxvkImageView* DxvkUnboundResources::getImageView(VkImageViewType type, bool sampled) const {
auto views = sampled ? &m_viewsSampled : &m_viewsStorage;
switch (type) {
case VK_IMAGE_VIEW_TYPE_1D: return m_view1D.ptr();
case VK_IMAGE_VIEW_TYPE_1D_ARRAY: return m_view1DArr.ptr();
case VK_IMAGE_VIEW_TYPE_2D: return m_view2D.ptr();
case VK_IMAGE_VIEW_TYPE_2D_ARRAY: return m_view2DArr.ptr();
case VK_IMAGE_VIEW_TYPE_CUBE: return m_viewCube.ptr();
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return m_viewCubeArr.ptr();
case VK_IMAGE_VIEW_TYPE_3D: return m_view3D.ptr();
default: Logger::err("null"); return nullptr;
case VK_IMAGE_VIEW_TYPE_1D: return views->view1D.ptr();
case VK_IMAGE_VIEW_TYPE_1D_ARRAY: return views->view1DArr.ptr();
case VK_IMAGE_VIEW_TYPE_2D: return views->view2D.ptr();
case VK_IMAGE_VIEW_TYPE_2D_ARRAY: return views->view2DArr.ptr();
case VK_IMAGE_VIEW_TYPE_CUBE: return views->viewCube.ptr();
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return views->viewCubeArr.ptr();
case VK_IMAGE_VIEW_TYPE_3D: return views->view3D.ptr();
default: return nullptr;
}
}

View File

@ -85,10 +85,11 @@ namespace dxvk {
*
* Contains both an image view and a sampler
* descriptor for the given image view type.
* \param [in] type Image view type
* \returns Dummy image view descriptor
*/
VkDescriptorImageInfo imageSamplerDescriptor(VkImageViewType type) const {
auto view = getImageView(type);
auto view = getImageView(type, true);
VkDescriptorImageInfo result;
result.sampler = m_sampler->handle();
@ -103,10 +104,12 @@ namespace dxvk {
* Points to an image view which, instead of
* reading image data, will return zeroes for
* all components unconditionally.
* \param [in] type Image view type
* \param [in] sampled Format selector
* \returns Dummy image view descriptor
*/
VkDescriptorImageInfo imageViewDescriptor(VkImageViewType type) const {
auto view = getImageView(type);
VkDescriptorImageInfo imageViewDescriptor(VkImageViewType type, bool sampled) const {
auto view = getImageView(type, sampled);
VkDescriptorImageInfo result;
result.sampler = VK_NULL_HANDLE;
@ -125,6 +128,16 @@ namespace dxvk {
private:
struct UnboundViews {
Rc<DxvkImageView> view1D;
Rc<DxvkImageView> view1DArr;
Rc<DxvkImageView> view2D;
Rc<DxvkImageView> view2DArr;
Rc<DxvkImageView> viewCube;
Rc<DxvkImageView> viewCubeArr;
Rc<DxvkImageView> view3D;
};
Rc<DxvkSampler> m_sampler;
Rc<DxvkBuffer> m_buffer;
@ -133,14 +146,9 @@ namespace dxvk {
Rc<DxvkImage> m_image1D;
Rc<DxvkImage> m_image2D;
Rc<DxvkImage> m_image3D;
Rc<DxvkImageView> m_view1D;
Rc<DxvkImageView> m_view1DArr;
Rc<DxvkImageView> m_view2D;
Rc<DxvkImageView> m_view2DArr;
Rc<DxvkImageView> m_viewCube;
Rc<DxvkImageView> m_viewCubeArr;
Rc<DxvkImageView> m_view3D;
UnboundViews m_viewsSampled;
UnboundViews m_viewsStorage;
Rc<DxvkSampler> createSampler(DxvkDevice* dev);
@ -158,11 +166,17 @@ namespace dxvk {
Rc<DxvkImageView> createImageView(
DxvkDevice* dev,
const Rc<DxvkImage>& image,
VkFormat format,
VkImageViewType type,
uint32_t layers);
UnboundViews createImageViews(
DxvkDevice* dev,
VkFormat format);
const DxvkImageView* getImageView(
VkImageViewType type) const;
VkImageViewType type,
bool sampled) const;
void clearBuffer(
const Rc<DxvkContext>& ctx,