mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07:00
vkd3d: Implement RasterizedStream.
Signed-off-by: Józef Kucia <jkucia@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
committed by
Alexandre Julliard
parent
e73fe9cc41
commit
61dd136cab
@@ -940,6 +940,7 @@ static HRESULT vkd3d_init_device_caps(struct d3d12_device *device,
|
|||||||
|
|
||||||
vulkan_info->device_limits = device_properties2.properties.limits;
|
vulkan_info->device_limits = device_properties2.properties.limits;
|
||||||
vulkan_info->sparse_properties = device_properties2.properties.sparseProperties;
|
vulkan_info->sparse_properties = device_properties2.properties.sparseProperties;
|
||||||
|
vulkan_info->rasterization_stream = xfb_properties.transformFeedbackRasterizationStreamSelect;
|
||||||
vulkan_info->max_vertex_attrib_divisor = max(vertex_divisor_properties.maxVertexAttribDivisor, 1);
|
vulkan_info->max_vertex_attrib_divisor = max(vertex_divisor_properties.maxVertexAttribDivisor, 1);
|
||||||
|
|
||||||
device->feature_options.DoublePrecisionFloatShaderOps = features->shaderFloat64;
|
device->feature_options.DoublePrecisionFloatShaderOps = features->shaderFloat64;
|
||||||
|
@@ -1614,6 +1614,27 @@ static void rs_desc_from_d3d12(struct VkPipelineRasterizationStateCreateInfo *vk
|
|||||||
FIXME("Ignoring ConservativeRaster %#x.\n", d3d12_desc->ConservativeRaster);
|
FIXME("Ignoring ConservativeRaster %#x.\n", d3d12_desc->ConservativeRaster);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void rs_stream_desc_from_d3d12(VkPipelineRasterizationStateStreamCreateInfoEXT *vk_desc,
|
||||||
|
VkPipelineRasterizationStateCreateInfo *vk_rs_desc, const D3D12_STREAM_OUTPUT_DESC *so_desc,
|
||||||
|
const struct vkd3d_vulkan_info *vk_info)
|
||||||
|
{
|
||||||
|
if (!so_desc->RasterizedStream || so_desc->RasterizedStream == D3D12_SO_NO_RASTERIZED_STREAM)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!vk_info->rasterization_stream)
|
||||||
|
{
|
||||||
|
FIXME("Rasterization stream select is not supported by Vulkan implementation.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
vk_desc->sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_STREAM_CREATE_INFO_EXT;
|
||||||
|
vk_desc->pNext = NULL;
|
||||||
|
vk_desc->flags = 0;
|
||||||
|
vk_desc->rasterizationStream = so_desc->RasterizedStream;
|
||||||
|
|
||||||
|
vk_rs_desc->pNext = vk_desc;
|
||||||
|
}
|
||||||
|
|
||||||
static enum VkStencilOp vk_stencil_op_from_d3d12(D3D12_STENCIL_OP op)
|
static enum VkStencilOp vk_stencil_op_from_d3d12(D3D12_STENCIL_OP op)
|
||||||
{
|
{
|
||||||
switch (op)
|
switch (op)
|
||||||
@@ -1916,6 +1937,7 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
|
|||||||
unsigned int ps_output_swizzle[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT];
|
unsigned int ps_output_swizzle[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT];
|
||||||
struct d3d12_graphics_pipeline_state *graphics = &state->u.graphics;
|
struct d3d12_graphics_pipeline_state *graphics = &state->u.graphics;
|
||||||
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
|
const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
|
||||||
|
const D3D12_STREAM_OUTPUT_DESC *so_desc = &desc->StreamOutput;
|
||||||
VkVertexInputBindingDivisorDescriptionEXT *binding_divisor;
|
VkVertexInputBindingDivisorDescriptionEXT *binding_divisor;
|
||||||
const struct vkd3d_vulkan_info *vk_info = &device->vk_info;
|
const struct vkd3d_vulkan_info *vk_info = &device->vk_info;
|
||||||
const struct vkd3d_shader_compile_arguments *compile_args;
|
const struct vkd3d_shader_compile_arguments *compile_args;
|
||||||
@@ -2350,9 +2372,12 @@ static HRESULT d3d12_pipeline_state_init_graphics(struct d3d12_pipeline_state *s
|
|||||||
}
|
}
|
||||||
|
|
||||||
rs_desc_from_d3d12(&graphics->rs_desc, &desc->RasterizerState);
|
rs_desc_from_d3d12(&graphics->rs_desc, &desc->RasterizerState);
|
||||||
if (!graphics->attachment_count && !(desc->PS.pShaderBytecode && desc->PS.BytecodeLength))
|
if ((!graphics->attachment_count && !(desc->PS.pShaderBytecode && desc->PS.BytecodeLength))
|
||||||
|
|| so_desc->RasterizedStream == D3D12_SO_NO_RASTERIZED_STREAM)
|
||||||
graphics->rs_desc.rasterizerDiscardEnable = VK_TRUE;
|
graphics->rs_desc.rasterizerDiscardEnable = VK_TRUE;
|
||||||
|
|
||||||
|
rs_stream_desc_from_d3d12(&graphics->rs_stream_desc, &graphics->rs_desc, so_desc, vk_info);
|
||||||
|
|
||||||
if (desc->SampleMask != ~0u)
|
if (desc->SampleMask != ~0u)
|
||||||
FIXME("Ignoring sample mask %#x.\n", desc->SampleMask);
|
FIXME("Ignoring sample mask %#x.\n", desc->SampleMask);
|
||||||
|
|
||||||
|
@@ -90,6 +90,8 @@ struct vkd3d_vulkan_info
|
|||||||
bool EXT_transform_feedback;
|
bool EXT_transform_feedback;
|
||||||
bool EXT_vertex_attribute_divisor;
|
bool EXT_vertex_attribute_divisor;
|
||||||
|
|
||||||
|
bool rasterization_stream;
|
||||||
|
|
||||||
bool vertex_attrib_zero_divisor;
|
bool vertex_attrib_zero_divisor;
|
||||||
unsigned int max_vertex_attrib_divisor;
|
unsigned int max_vertex_attrib_divisor;
|
||||||
|
|
||||||
@@ -559,7 +561,7 @@ struct d3d12_root_signature
|
|||||||
VkDescriptorSetLayout vk_push_set_layout;
|
VkDescriptorSetLayout vk_push_set_layout;
|
||||||
VkDescriptorSetLayout vk_set_layout;
|
VkDescriptorSetLayout vk_set_layout;
|
||||||
|
|
||||||
struct VkDescriptorPoolSize *pool_sizes;
|
VkDescriptorPoolSize *pool_sizes;
|
||||||
size_t pool_size_count;
|
size_t pool_size_count;
|
||||||
|
|
||||||
struct d3d12_root_parameter *parameters;
|
struct d3d12_root_parameter *parameters;
|
||||||
@@ -593,25 +595,27 @@ struct d3d12_root_signature *unsafe_impl_from_ID3D12RootSignature(ID3D12RootSign
|
|||||||
|
|
||||||
struct d3d12_graphics_pipeline_state
|
struct d3d12_graphics_pipeline_state
|
||||||
{
|
{
|
||||||
struct VkPipelineShaderStageCreateInfo stages[VKD3D_MAX_SHADER_STAGES];
|
VkPipelineShaderStageCreateInfo stages[VKD3D_MAX_SHADER_STAGES];
|
||||||
size_t stage_count;
|
size_t stage_count;
|
||||||
|
|
||||||
struct VkVertexInputAttributeDescription attributes[D3D12_VS_INPUT_REGISTER_COUNT];
|
VkVertexInputAttributeDescription attributes[D3D12_VS_INPUT_REGISTER_COUNT];
|
||||||
enum VkVertexInputRate input_rates[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
|
VkVertexInputRate input_rates[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
|
||||||
VkVertexInputBindingDivisorDescriptionEXT instance_divisors[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
|
VkVertexInputBindingDivisorDescriptionEXT instance_divisors[D3D12_IA_VERTEX_INPUT_RESOURCE_SLOT_COUNT];
|
||||||
size_t instance_divisor_count;
|
size_t instance_divisor_count;
|
||||||
size_t attribute_count;
|
size_t attribute_count;
|
||||||
|
|
||||||
struct VkAttachmentDescription attachments[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT + 1];
|
VkAttachmentDescription attachments[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT + 1];
|
||||||
struct VkAttachmentReference attachment_references[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT + 1];
|
VkAttachmentReference attachment_references[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT + 1];
|
||||||
struct VkPipelineColorBlendAttachmentState blend_attachments[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT];
|
VkPipelineColorBlendAttachmentState blend_attachments[D3D12_SIMULTANEOUS_RENDER_TARGET_COUNT];
|
||||||
size_t attachment_count, rt_idx;
|
size_t attachment_count, rt_idx;
|
||||||
VkRenderPass render_pass;
|
VkRenderPass render_pass;
|
||||||
|
|
||||||
D3D12_INDEX_BUFFER_STRIP_CUT_VALUE index_buffer_strip_cut_value;
|
D3D12_INDEX_BUFFER_STRIP_CUT_VALUE index_buffer_strip_cut_value;
|
||||||
struct VkPipelineRasterizationStateCreateInfo rs_desc;
|
VkPipelineRasterizationStateCreateInfo rs_desc;
|
||||||
struct VkPipelineMultisampleStateCreateInfo ms_desc;
|
VkPipelineMultisampleStateCreateInfo ms_desc;
|
||||||
struct VkPipelineDepthStencilStateCreateInfo ds_desc;
|
VkPipelineDepthStencilStateCreateInfo ds_desc;
|
||||||
|
|
||||||
|
VkPipelineRasterizationStateStreamCreateInfoEXT rs_stream_desc;
|
||||||
|
|
||||||
const struct d3d12_root_signature *root_signature;
|
const struct d3d12_root_signature *root_signature;
|
||||||
|
|
||||||
@@ -961,7 +965,7 @@ static inline unsigned int d3d12_resource_desc_get_sub_resource_count(const D3D1
|
|||||||
return d3d12_resource_desc_get_layer_count(desc) * desc->MipLevels;
|
return d3d12_resource_desc_get_layer_count(desc) * desc->MipLevels;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum VkCompareOp vk_compare_op_from_d3d12(D3D12_COMPARISON_FUNC op) DECLSPEC_HIDDEN;
|
VkCompareOp vk_compare_op_from_d3d12(D3D12_COMPARISON_FUNC op) DECLSPEC_HIDDEN;
|
||||||
VkSampleCountFlagBits vk_samples_from_dxgi_sample_desc(const DXGI_SAMPLE_DESC *desc) DECLSPEC_HIDDEN;
|
VkSampleCountFlagBits vk_samples_from_dxgi_sample_desc(const DXGI_SAMPLE_DESC *desc) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
bool is_valid_feature_level(D3D_FEATURE_LEVEL feature_level) DECLSPEC_HIDDEN;
|
bool is_valid_feature_level(D3D_FEATURE_LEVEL feature_level) DECLSPEC_HIDDEN;
|
||||||
|
Reference in New Issue
Block a user