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:
parent
e615416b31
commit
48b3b3ee85
@ -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:
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user