Skip to content

Commit

Permalink
Merge #3500
Browse files Browse the repository at this point in the history
3500: [vk] fix viewport/scissor count validation error r=kvark a=kvark

Fixes this VU reported in gfx-rs/wgpu#1059 :
> [0.375320 ERROR]()(no module):
VALIDATION [VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216 (-376016417)] : Validation Error: [ VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216 ] Object 0: handle = 0x2d93dbcf100, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0xe99671df | vkCreateGraphicsPipelines: The VkPhysicalDeviceFeatures::multiViewport feature is disabled, but pCreateInfos[0].pViewportState->viewportCount (=0) is not 1. The Vulkan spec states: If the multiple viewports feature is not enabled, viewportCount must be 1 (https://vulkan.lunarg.com/doc/view/1.2.141.0/windows/1.2-extensions/vkspec.html#VUID-VkPipelineViewportStateCreateInfo-viewportCount-01216)
object info: (type: DEVICE, hndl: 3132066951424)

PR checklist:
- [x] `make` succeeds (on *nix)
- [ ] `make reftests` succeeds
- [x] tested on wgpu-rs examples


Co-authored-by: Dzmitry Malyshau <dmalyshau@mozilla.com>
  • Loading branch information
bors[bot] and kvark committed Dec 2, 2020
2 parents 56650ea + 3d495df commit 294bac8
Showing 1 changed file with 15 additions and 21 deletions.
36 changes: 15 additions & 21 deletions src/backend/vulkan/src/device.rs
Expand Up @@ -54,8 +54,8 @@ struct GraphicsPipelineInfoBuf {
depth_stencil_state: vk::PipelineDepthStencilStateCreateInfo,
color_blend_state: vk::PipelineColorBlendStateCreateInfo,
pipeline_dynamic_state: vk::PipelineDynamicStateCreateInfo,
viewport: vk::Viewport,
scissor: vk::Rect2D,
viewports: [vk::Viewport; 1],
scissors: [vk::Rect2D; 1],
}
impl GraphicsPipelineInfoBuf {
unsafe fn add_stage<'a>(
Expand Down Expand Up @@ -256,36 +256,30 @@ impl GraphicsPipelineInfoBuf {
};

this.viewport_state = {
let scissors = match desc.baked_states.scissor {
//Note: without `multiViewport` feature, there has to be
// the count of 1 for both viewports and scissors, even
// though the actual pointers are ignored.
match desc.baked_states.scissor {
Some(ref rect) => {
this.scissor = conv::map_rect(rect);
Some([this.scissor])
this.scissors = [conv::map_rect(rect)];
}
None => {
this.dynamic_states.push(vk::DynamicState::SCISSOR);
None
}
};
let viewports = match desc.baked_states.viewport {
}
match desc.baked_states.viewport {
Some(ref vp) => {
this.viewport = device.shared.map_viewport(vp);
Some([this.viewport])
this.viewports = [device.shared.map_viewport(vp)];
}
None => {
this.dynamic_states.push(vk::DynamicState::VIEWPORT);
None
}
};

let mut builder = vk::PipelineViewportStateCreateInfo::builder()
.flags(vk::PipelineViewportStateCreateFlags::empty());
if let Some(scissors) = &scissors {
builder = builder.scissors(scissors);
}
if let Some(viewports) = &viewports {
builder = builder.viewports(viewports);
}
builder.build()
vk::PipelineViewportStateCreateInfo::builder()
.flags(vk::PipelineViewportStateCreateFlags::empty())
.scissors(&this.scissors)
.viewports(&this.viewports)
.build()
};

this.multisample_state = match desc.multisampling {
Expand Down

0 comments on commit 294bac8

Please sign in to comment.