mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-03-14 22:29:15 +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:
parent
e615416b31
commit
48b3b3ee85
@ -3753,7 +3753,7 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bindMask.clr(i);
|
bindMask.clr(i);
|
||||||
descriptors[i].image = m_common->dummyResources().imageViewDescriptor(binding.view);
|
descriptors[i].image = m_common->dummyResources().imageViewDescriptor(binding.view, true);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
|
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
|
||||||
@ -3771,7 +3771,7 @@ namespace dxvk {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bindMask.clr(i);
|
bindMask.clr(i);
|
||||||
descriptors[i].image = m_common->dummyResources().imageViewDescriptor(binding.view);
|
descriptors[i].image = m_common->dummyResources().imageViewDescriptor(binding.view, false);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
|
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
|
||||||
|
@ -9,13 +9,8 @@ namespace dxvk {
|
|||||||
m_image1D (createImage(dev, VK_IMAGE_TYPE_1D, 1)),
|
m_image1D (createImage(dev, VK_IMAGE_TYPE_1D, 1)),
|
||||||
m_image2D (createImage(dev, VK_IMAGE_TYPE_2D, 6)),
|
m_image2D (createImage(dev, VK_IMAGE_TYPE_2D, 6)),
|
||||||
m_image3D (createImage(dev, VK_IMAGE_TYPE_3D, 1)),
|
m_image3D (createImage(dev, VK_IMAGE_TYPE_3D, 1)),
|
||||||
m_view1D (createImageView(dev, m_image1D, VK_IMAGE_VIEW_TYPE_1D, 1)),
|
m_viewsSampled (createImageViews(dev, VK_FORMAT_R32_SFLOAT)),
|
||||||
m_view1DArr (createImageView(dev, m_image1D, VK_IMAGE_VIEW_TYPE_1D_ARRAY, 1)),
|
m_viewsStorage (createImageViews(dev, VK_FORMAT_R32_UINT)) {
|
||||||
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)) {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,11 +123,12 @@ namespace dxvk {
|
|||||||
Rc<DxvkImageView> DxvkUnboundResources::createImageView(
|
Rc<DxvkImageView> DxvkUnboundResources::createImageView(
|
||||||
DxvkDevice* dev,
|
DxvkDevice* dev,
|
||||||
const Rc<DxvkImage>& image,
|
const Rc<DxvkImage>& image,
|
||||||
|
VkFormat format,
|
||||||
VkImageViewType type,
|
VkImageViewType type,
|
||||||
uint32_t layers) {
|
uint32_t layers) {
|
||||||
DxvkImageViewCreateInfo info;
|
DxvkImageViewCreateInfo info;
|
||||||
info.type = type;
|
info.type = type;
|
||||||
info.format = image->info().format;
|
info.format = format;
|
||||||
info.usage = VK_IMAGE_USAGE_SAMPLED_BIT
|
info.usage = VK_IMAGE_USAGE_SAMPLED_BIT
|
||||||
| VK_IMAGE_USAGE_STORAGE_BIT;
|
| VK_IMAGE_USAGE_STORAGE_BIT;
|
||||||
info.aspect = VK_IMAGE_ASPECT_COLOR_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) {
|
switch (type) {
|
||||||
case VK_IMAGE_VIEW_TYPE_1D: return m_view1D.ptr();
|
case VK_IMAGE_VIEW_TYPE_1D: return views->view1D.ptr();
|
||||||
case VK_IMAGE_VIEW_TYPE_1D_ARRAY: return m_view1DArr.ptr();
|
case VK_IMAGE_VIEW_TYPE_1D_ARRAY: return views->view1DArr.ptr();
|
||||||
case VK_IMAGE_VIEW_TYPE_2D: return m_view2D.ptr();
|
case VK_IMAGE_VIEW_TYPE_2D: return views->view2D.ptr();
|
||||||
case VK_IMAGE_VIEW_TYPE_2D_ARRAY: return m_view2DArr.ptr();
|
case VK_IMAGE_VIEW_TYPE_2D_ARRAY: return views->view2DArr.ptr();
|
||||||
case VK_IMAGE_VIEW_TYPE_CUBE: return m_viewCube.ptr();
|
case VK_IMAGE_VIEW_TYPE_CUBE: return views->viewCube.ptr();
|
||||||
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return m_viewCubeArr.ptr();
|
case VK_IMAGE_VIEW_TYPE_CUBE_ARRAY: return views->viewCubeArr.ptr();
|
||||||
case VK_IMAGE_VIEW_TYPE_3D: return m_view3D.ptr();
|
case VK_IMAGE_VIEW_TYPE_3D: return views->view3D.ptr();
|
||||||
default: Logger::err("null"); return nullptr;
|
default: return nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,10 +85,11 @@ namespace dxvk {
|
|||||||
*
|
*
|
||||||
* Contains both an image view and a sampler
|
* Contains both an image view and a sampler
|
||||||
* descriptor for the given image view type.
|
* descriptor for the given image view type.
|
||||||
|
* \param [in] type Image view type
|
||||||
* \returns Dummy image view descriptor
|
* \returns Dummy image view descriptor
|
||||||
*/
|
*/
|
||||||
VkDescriptorImageInfo imageSamplerDescriptor(VkImageViewType type) const {
|
VkDescriptorImageInfo imageSamplerDescriptor(VkImageViewType type) const {
|
||||||
auto view = getImageView(type);
|
auto view = getImageView(type, true);
|
||||||
|
|
||||||
VkDescriptorImageInfo result;
|
VkDescriptorImageInfo result;
|
||||||
result.sampler = m_sampler->handle();
|
result.sampler = m_sampler->handle();
|
||||||
@ -103,10 +104,12 @@ namespace dxvk {
|
|||||||
* Points to an image view which, instead of
|
* Points to an image view which, instead of
|
||||||
* reading image data, will return zeroes for
|
* reading image data, will return zeroes for
|
||||||
* all components unconditionally.
|
* all components unconditionally.
|
||||||
|
* \param [in] type Image view type
|
||||||
|
* \param [in] sampled Format selector
|
||||||
* \returns Dummy image view descriptor
|
* \returns Dummy image view descriptor
|
||||||
*/
|
*/
|
||||||
VkDescriptorImageInfo imageViewDescriptor(VkImageViewType type) const {
|
VkDescriptorImageInfo imageViewDescriptor(VkImageViewType type, bool sampled) const {
|
||||||
auto view = getImageView(type);
|
auto view = getImageView(type, sampled);
|
||||||
|
|
||||||
VkDescriptorImageInfo result;
|
VkDescriptorImageInfo result;
|
||||||
result.sampler = VK_NULL_HANDLE;
|
result.sampler = VK_NULL_HANDLE;
|
||||||
@ -125,6 +128,16 @@ namespace dxvk {
|
|||||||
|
|
||||||
private:
|
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<DxvkSampler> m_sampler;
|
||||||
|
|
||||||
Rc<DxvkBuffer> m_buffer;
|
Rc<DxvkBuffer> m_buffer;
|
||||||
@ -133,14 +146,9 @@ namespace dxvk {
|
|||||||
Rc<DxvkImage> m_image1D;
|
Rc<DxvkImage> m_image1D;
|
||||||
Rc<DxvkImage> m_image2D;
|
Rc<DxvkImage> m_image2D;
|
||||||
Rc<DxvkImage> m_image3D;
|
Rc<DxvkImage> m_image3D;
|
||||||
|
|
||||||
Rc<DxvkImageView> m_view1D;
|
UnboundViews m_viewsSampled;
|
||||||
Rc<DxvkImageView> m_view1DArr;
|
UnboundViews m_viewsStorage;
|
||||||
Rc<DxvkImageView> m_view2D;
|
|
||||||
Rc<DxvkImageView> m_view2DArr;
|
|
||||||
Rc<DxvkImageView> m_viewCube;
|
|
||||||
Rc<DxvkImageView> m_viewCubeArr;
|
|
||||||
Rc<DxvkImageView> m_view3D;
|
|
||||||
|
|
||||||
Rc<DxvkSampler> createSampler(DxvkDevice* dev);
|
Rc<DxvkSampler> createSampler(DxvkDevice* dev);
|
||||||
|
|
||||||
@ -158,11 +166,17 @@ namespace dxvk {
|
|||||||
Rc<DxvkImageView> createImageView(
|
Rc<DxvkImageView> createImageView(
|
||||||
DxvkDevice* dev,
|
DxvkDevice* dev,
|
||||||
const Rc<DxvkImage>& image,
|
const Rc<DxvkImage>& image,
|
||||||
|
VkFormat format,
|
||||||
VkImageViewType type,
|
VkImageViewType type,
|
||||||
uint32_t layers);
|
uint32_t layers);
|
||||||
|
|
||||||
|
UnboundViews createImageViews(
|
||||||
|
DxvkDevice* dev,
|
||||||
|
VkFormat format);
|
||||||
|
|
||||||
const DxvkImageView* getImageView(
|
const DxvkImageView* getImageView(
|
||||||
VkImageViewType type) const;
|
VkImageViewType type,
|
||||||
|
bool sampled) const;
|
||||||
|
|
||||||
void clearBuffer(
|
void clearBuffer(
|
||||||
const Rc<DxvkContext>& ctx,
|
const Rc<DxvkContext>& ctx,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user