mirror of
https://github.com/italicsjenga/portability.git
synced 2024-11-26 17:01:31 +11:00
Merge #75
75: Use rasterizer discard r=kvark a=grovesNL Stop setting the fragment shader and other states as stated in the spec when rasterizer discard is set. (Should anything else be disabled?) Fixes segfaults in `dEQP-VK.api.descriptor_set.descriptor_set_layout_lifetime.graphics` on Metal (with gfx-rs/gfx#2035 fix) Co-authored-by: Joshua Groves <josh@joshgroves.com>
This commit is contained in:
commit
fa5a78d60c
|
@ -1485,6 +1485,29 @@ pub extern "C" fn gfxCreateGraphicsPipelines(
|
||||||
let mut cur_shader_stage = 0;
|
let mut cur_shader_stage = 0;
|
||||||
|
|
||||||
let descs = infos.into_iter().map(|info| {
|
let descs = infos.into_iter().map(|info| {
|
||||||
|
let (rasterizer, rasterizer_discard) = {
|
||||||
|
let state = unsafe { &*info.pRasterizationState };
|
||||||
|
|
||||||
|
let rasterizer = pso::Rasterizer {
|
||||||
|
polygon_mode: conv::map_polygon_mode(state.polygonMode, state.lineWidth),
|
||||||
|
cull_face: conv::map_cull_face(state.cullMode),
|
||||||
|
front_face: conv::map_front_face(state.frontFace),
|
||||||
|
depth_clamping: state.depthClampEnable == VK_TRUE,
|
||||||
|
depth_bias: if state.depthBiasEnable == VK_TRUE {
|
||||||
|
Some(pso::DepthBias {
|
||||||
|
const_factor: state.depthBiasConstantFactor,
|
||||||
|
clamp: state.depthBiasClamp,
|
||||||
|
slope_factor: state.depthBiasSlopeFactor,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
},
|
||||||
|
conservative: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
(rasterizer, state.rasterizerDiscardEnable == VK_TRUE)
|
||||||
|
};
|
||||||
|
|
||||||
let shaders = {
|
let shaders = {
|
||||||
let mut set: pso::GraphicsShaderSet<_> = unsafe { mem::zeroed() };
|
let mut set: pso::GraphicsShaderSet<_> = unsafe { mem::zeroed() };
|
||||||
|
|
||||||
|
@ -1509,7 +1532,7 @@ pub extern "C" fn gfxCreateGraphicsPipelines(
|
||||||
VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT => { set.hull = Some(entry_point); }
|
VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT => { set.hull = Some(entry_point); }
|
||||||
VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT => { set.domain = Some(entry_point); }
|
VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT => { set.domain = Some(entry_point); }
|
||||||
VK_SHADER_STAGE_GEOMETRY_BIT => { set.geometry = Some(entry_point); }
|
VK_SHADER_STAGE_GEOMETRY_BIT => { set.geometry = Some(entry_point); }
|
||||||
VK_SHADER_STAGE_FRAGMENT_BIT => { set.fragment = Some(entry_point); }
|
VK_SHADER_STAGE_FRAGMENT_BIT if !rasterizer_discard => { set.fragment = Some(entry_point); }
|
||||||
stage => panic!("Unexpected shader stage: {:?}", stage),
|
stage => panic!("Unexpected shader stage: {:?}", stage),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1517,31 +1540,6 @@ pub extern "C" fn gfxCreateGraphicsPipelines(
|
||||||
set
|
set
|
||||||
};
|
};
|
||||||
|
|
||||||
let (rasterizer, rasterizer_discard) = {
|
|
||||||
let state = unsafe { &*info.pRasterizationState };
|
|
||||||
|
|
||||||
assert_eq!(state.rasterizerDiscardEnable, VK_FALSE); // TODO
|
|
||||||
|
|
||||||
let rasterizer = pso::Rasterizer {
|
|
||||||
polygon_mode: conv::map_polygon_mode(state.polygonMode, state.lineWidth),
|
|
||||||
cull_face: conv::map_cull_face(state.cullMode),
|
|
||||||
front_face: conv::map_front_face(state.frontFace),
|
|
||||||
depth_clamping: state.depthClampEnable == VK_TRUE,
|
|
||||||
depth_bias: if state.depthBiasEnable == VK_TRUE {
|
|
||||||
Some(pso::DepthBias {
|
|
||||||
const_factor: state.depthBiasConstantFactor,
|
|
||||||
clamp: state.depthBiasClamp,
|
|
||||||
slope_factor: state.depthBiasSlopeFactor,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
},
|
|
||||||
conservative: false,
|
|
||||||
};
|
|
||||||
|
|
||||||
(rasterizer, state.rasterizerDiscardEnable == VK_TRUE)
|
|
||||||
};
|
|
||||||
|
|
||||||
let (vertex_buffers, attributes) = {
|
let (vertex_buffers, attributes) = {
|
||||||
let input_state = unsafe { &*info.pVertexInputState };
|
let input_state = unsafe { &*info.pVertexInputState };
|
||||||
|
|
||||||
|
@ -1676,7 +1674,8 @@ pub extern "C" fn gfxCreateGraphicsPipelines(
|
||||||
|
|
||||||
// TODO: `pDepthStencilState` could contain garbage, but implementations
|
// TODO: `pDepthStencilState` could contain garbage, but implementations
|
||||||
// can ignore it in some circumstances. How to handle it?
|
// can ignore it in some circumstances. How to handle it?
|
||||||
let depth_stencil = unsafe { info
|
let depth_stencil = if !rasterizer_discard {
|
||||||
|
unsafe { info
|
||||||
.pDepthStencilState
|
.pDepthStencilState
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|state| {
|
.map(|state| {
|
||||||
|
@ -1718,27 +1717,36 @@ pub extern "C" fn gfxCreateGraphicsPipelines(
|
||||||
stencil: stencil_test,
|
stencil: stencil_test,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
let vp_state = unsafe { &*info.pViewportState };
|
let vp_state = if !rasterizer_discard {
|
||||||
|
unsafe { info.pViewportState.as_ref() }
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
let empty_dyn_states = [];
|
let empty_dyn_states = [];
|
||||||
let dyn_states = match unsafe { info.pDynamicState.as_ref() } {
|
let dyn_states = match unsafe { info.pDynamicState.as_ref() } {
|
||||||
Some(state) => unsafe {
|
Some(state) if !rasterizer_discard => unsafe {
|
||||||
slice::from_raw_parts(state.pDynamicStates, state.dynamicStateCount as _)
|
slice::from_raw_parts(state.pDynamicStates, state.dynamicStateCount as _)
|
||||||
},
|
},
|
||||||
None => &empty_dyn_states,
|
_ => &empty_dyn_states,
|
||||||
};
|
};
|
||||||
let baked_states = pso::BakedStates {
|
let baked_states = pso::BakedStates {
|
||||||
viewport: if dyn_states.iter().any(|&ds| ds == VkDynamicState::VK_DYNAMIC_STATE_VIEWPORT) {
|
viewport: if dyn_states.iter().any(|&ds| ds == VkDynamicState::VK_DYNAMIC_STATE_VIEWPORT) {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
unsafe { vp_state.pViewports.as_ref() }
|
vp_state
|
||||||
|
.and_then(|vp| unsafe { vp.pViewports.as_ref() })
|
||||||
.map(conv::map_viewport)
|
.map(conv::map_viewport)
|
||||||
},
|
},
|
||||||
scissor: if dyn_states.iter().any(|&ds| ds == VkDynamicState::VK_DYNAMIC_STATE_SCISSOR) {
|
scissor: if dyn_states.iter().any(|&ds| ds == VkDynamicState::VK_DYNAMIC_STATE_SCISSOR) {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
unsafe { vp_state.pScissors.as_ref() }
|
vp_state
|
||||||
|
.and_then(|vp| unsafe { vp.pScissors.as_ref() })
|
||||||
.map(conv::map_rect)
|
.map(conv::map_rect)
|
||||||
},
|
},
|
||||||
blend_color: if dyn_states.iter().any(|&ds| ds == VkDynamicState::VK_DYNAMIC_STATE_BLEND_CONSTANTS) {
|
blend_color: if dyn_states.iter().any(|&ds| ds == VkDynamicState::VK_DYNAMIC_STATE_BLEND_CONSTANTS) {
|
||||||
|
|
Loading…
Reference in a new issue