Henri Verbeet : wined3d: Implement rasterisation object support for the Vulkan adapter.
Alexandre Julliard
julliard at winehq.org
Tue May 19 16:07:49 CDT 2020
Module: wine
Branch: master
Commit: 4358ddc75fbfabdc4a4f31b4e3cc9aa1e0811d4c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=4358ddc75fbfabdc4a4f31b4e3cc9aa1e0811d4c
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Wed May 20 00:20:31 2020 +0430
wined3d: Implement rasterisation object support for the Vulkan adapter.
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wined3d/context_vk.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 90 insertions(+)
diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c
index 4f27e46433..0295880f0a 100644
--- a/dlls/wined3d/context_vk.c
+++ b/dlls/wined3d/context_vk.c
@@ -169,6 +169,22 @@ static VkColorComponentFlags vk_colour_write_mask_from_wined3d(uint32_t wined3d_
return vk_mask;
}
+static VkCullModeFlags vk_cull_mode_from_wined3d(enum wined3d_cull mode)
+{
+ switch (mode)
+ {
+ case WINED3D_CULL_NONE:
+ return VK_CULL_MODE_NONE;
+ case WINED3D_CULL_FRONT:
+ return VK_CULL_MODE_FRONT_BIT;
+ case WINED3D_CULL_BACK:
+ return VK_CULL_MODE_BACK_BIT;
+ default:
+ FIXME("Unhandled cull mode %#x.\n", mode);
+ return VK_CULL_MODE_NONE;
+ }
+}
+
void *wined3d_allocator_chunk_vk_map(struct wined3d_allocator_chunk_vk *chunk_vk,
struct wined3d_context_vk *context_vk)
{
@@ -1487,6 +1503,73 @@ static void wined3d_context_vk_init_graphics_pipeline_key(struct wined3d_context
key->pipeline_desc.basePipelineIndex = -1;
}
+static void wined3d_context_vk_update_rasterisation_state(const struct wined3d_context_vk *context_vk,
+ const struct wined3d_state *state, struct wined3d_graphics_pipeline_key_vk *key)
+{
+ const struct wined3d_d3d_info *d3d_info = context_vk->c.d3d_info;
+ VkPipelineRasterizationStateCreateInfo *desc = &key->rs_desc;
+ const struct wined3d_rasterizer_state_desc *r;
+ float scale_bias;
+ union
+ {
+ uint32_t u32;
+ float f32;
+ } const_bias;
+
+ if (!state->rasterizer_state)
+ {
+ desc->depthClampEnable = VK_FALSE;
+ desc->cullMode = VK_CULL_MODE_BACK_BIT;
+ desc->frontFace = VK_FRONT_FACE_CLOCKWISE;
+ desc->depthBiasEnable = VK_FALSE;
+ desc->depthBiasConstantFactor = 0.0f;
+ desc->depthBiasClamp = 0.0f;
+ desc->depthBiasSlopeFactor = 0.0f;
+
+ return;
+ }
+
+ r = &state->rasterizer_state->desc;
+ desc->depthClampEnable = !r->depth_clip;
+ desc->cullMode = vk_cull_mode_from_wined3d(r->cull_mode);
+ desc->frontFace = r->front_ccw ? VK_FRONT_FACE_COUNTER_CLOCKWISE : VK_FRONT_FACE_CLOCKWISE;
+
+ scale_bias = r->scale_bias;
+ const_bias.f32 = r->depth_bias;
+ if (!scale_bias && !const_bias.f32)
+ {
+ desc->depthBiasEnable = VK_FALSE;
+ desc->depthBiasConstantFactor = 0.0f;
+ desc->depthBiasClamp = 0.0f;
+ desc->depthBiasSlopeFactor = 0.0f;
+
+ return;
+ }
+
+ desc->depthBiasEnable = VK_TRUE;
+ if (d3d_info->wined3d_creation_flags & WINED3D_LEGACY_DEPTH_BIAS)
+ {
+ const struct wined3d_rendertarget_view *dsv;
+
+ if ((dsv = state->fb.depth_stencil))
+ {
+ desc->depthBiasConstantFactor = -(float)const_bias.u32 / dsv->format->depth_bias_scale;
+ desc->depthBiasSlopeFactor = -(float)const_bias.u32;
+ }
+ else
+ {
+ desc->depthBiasConstantFactor = 0.0f;
+ desc->depthBiasSlopeFactor = 0.0f;
+ }
+ }
+ else
+ {
+ desc->depthBiasConstantFactor = const_bias.f32;
+ desc->depthBiasSlopeFactor = scale_bias;
+ }
+ desc->depthBiasClamp = r->depth_bias_clamp;
+}
+
static void wined3d_context_vk_update_blend_state(const struct wined3d_context_vk *context_vk,
const struct wined3d_state *state, struct wined3d_graphics_pipeline_key_vk *key)
{
@@ -1658,6 +1741,13 @@ static bool wined3d_context_vk_update_graphics_pipeline_key(struct wined3d_conte
update = true;
}
+ if (wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_RASTERIZER))
+ {
+ wined3d_context_vk_update_rasterisation_state(context_vk, state, key);
+
+ update = true;
+ }
+
if (key->ms_desc.rasterizationSamples != context_vk->sample_count)
{
key->ms_desc.rasterizationSamples = context_vk->sample_count;
More information about the wine-cvs
mailing list