mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-06 09:17:14 +00:00
wined3d: Implement multiple viewports for the Vulkan adapter.
This commit is contained in:
parent
347c830337
commit
d89ff71239
|
@ -2255,6 +2255,7 @@ static bool feature_level_9_3_supported(const struct wined3d_physical_device_inf
|
|||
static bool feature_level_10_supported(const struct wined3d_physical_device_info *info, unsigned int shader_model)
|
||||
{
|
||||
return shader_model >= 4
|
||||
&& info->features2.features.multiViewport
|
||||
&& info->vertex_divisor_features.vertexAttributeInstanceRateDivisor
|
||||
&& info->vertex_divisor_features.vertexAttributeInstanceRateZeroDivisor;
|
||||
}
|
||||
|
@ -2290,6 +2291,7 @@ static enum wined3d_feature_level feature_level_from_caps(const struct wined3d_p
|
|||
static void wined3d_adapter_vk_init_d3d_info(struct wined3d_adapter_vk *adapter_vk, uint32_t wined3d_creation_flags)
|
||||
{
|
||||
struct wined3d_d3d_info *d3d_info = &adapter_vk->a.d3d_info;
|
||||
struct wined3d_vk_info *vk_info = &adapter_vk->vk_info;
|
||||
struct wined3d_physical_device_info device_info;
|
||||
struct wined3d_vertex_caps vertex_caps;
|
||||
struct fragment_caps fragment_caps;
|
||||
|
@ -2356,6 +2358,8 @@ static void wined3d_adapter_vk_init_d3d_info(struct wined3d_adapter_vk *adapter_
|
|||
d3d_info->filling_convention_offset = 0.0f;
|
||||
|
||||
d3d_info->multisample_draw_location = WINED3D_LOCATION_TEXTURE_RGB;
|
||||
|
||||
vk_info->multiple_viewports = device_info.features2.features.multiViewport;
|
||||
}
|
||||
|
||||
static bool wined3d_adapter_vk_init_device_extensions(struct wined3d_adapter_vk *adapter_vk)
|
||||
|
|
|
@ -1985,10 +1985,9 @@ static int wined3d_graphics_pipeline_vk_compare(const void *key, const struct wi
|
|||
if ((ret = wined3d_uint32_compare(a->ts_desc.patchControlPoints, b->ts_desc.patchControlPoints)))
|
||||
return ret;
|
||||
|
||||
if ((ret = memcmp(&a->viewport, &b->viewport, sizeof(a->viewport))))
|
||||
if ((ret = memcmp(a->viewports, b->viewports, sizeof(a->viewports))))
|
||||
return ret;
|
||||
|
||||
if ((ret = memcmp(&a->scissor, &b->scissor, sizeof(a->scissor))))
|
||||
if ((ret = memcmp(a->scissors, b->scissors, sizeof(a->scissors))))
|
||||
return ret;
|
||||
|
||||
if ((ret = memcmp(&a->rs_desc, &b->rs_desc, sizeof(a->rs_desc))))
|
||||
|
@ -2066,10 +2065,8 @@ static void wined3d_context_vk_init_graphics_pipeline_key(struct wined3d_context
|
|||
key->ts_desc.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
|
||||
|
||||
key->vp_desc.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
|
||||
key->vp_desc.viewportCount = 1;
|
||||
key->vp_desc.pViewports = &key->viewport;
|
||||
key->vp_desc.scissorCount = 1;
|
||||
key->vp_desc.pScissors = &key->scissor;
|
||||
key->vp_desc.pViewports = key->viewports;
|
||||
key->vp_desc.pScissors = key->scissors;
|
||||
|
||||
key->rs_desc.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
|
||||
key->rs_desc.lineWidth = 1.0f;
|
||||
|
@ -2418,36 +2415,65 @@ static bool wined3d_context_vk_update_graphics_pipeline_key(struct wined3d_conte
|
|||
|| wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_SCISSORRECT)
|
||||
|| wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_RASTERIZER))
|
||||
{
|
||||
key->viewport.x = state->viewports[0].x;
|
||||
key->viewport.y = state->viewports[0].y;
|
||||
key->viewport.width = state->viewports[0].width;
|
||||
key->viewport.height = state->viewports[0].height;
|
||||
key->viewport.minDepth = state->viewports[0].min_z;
|
||||
key->viewport.maxDepth = state->viewports[0].max_z;
|
||||
key->vp_desc.viewportCount = (context_vk->vk_info->multiple_viewports ? WINED3D_MAX_VIEWPORTS : 1);
|
||||
key->vp_desc.scissorCount = key->vp_desc.viewportCount;
|
||||
|
||||
if (state->rasterizer_state && state->rasterizer_state->desc.scissor)
|
||||
for (i = 0; i < key->vp_desc.viewportCount; ++i)
|
||||
{
|
||||
const RECT *r = &state->scissor_rects[0];
|
||||
const struct wined3d_viewport *src_viewport = &state->viewports[i];
|
||||
VkViewport *viewport = &key->viewports[i];
|
||||
VkRect2D *scissor = &key->scissors[i];
|
||||
|
||||
key->scissor.offset.x = r->left;
|
||||
key->scissor.offset.y = r->top;
|
||||
key->scissor.extent.width = r->right - r->left;
|
||||
key->scissor.extent.height = r->bottom - r->top;
|
||||
if (i >= state->viewport_count)
|
||||
{
|
||||
viewport->x = 0.0f;
|
||||
viewport->y = 0.0f;
|
||||
viewport->width = 1.0f;
|
||||
viewport->height = 1.0f;
|
||||
viewport->minDepth = 0.0f;
|
||||
viewport->maxDepth = 0.0f;
|
||||
|
||||
memset(scissor, 0, sizeof(*scissor));
|
||||
continue;
|
||||
}
|
||||
|
||||
viewport->x = src_viewport->x;
|
||||
viewport->y = src_viewport->y;
|
||||
viewport->width = src_viewport->width;
|
||||
viewport->height = src_viewport->height;
|
||||
viewport->minDepth = src_viewport->min_z;
|
||||
viewport->maxDepth = src_viewport->max_z;
|
||||
|
||||
if (state->rasterizer_state && state->rasterizer_state->desc.scissor)
|
||||
{
|
||||
const RECT *r = &state->scissor_rects[i];
|
||||
|
||||
if (i >= state->scissor_rect_count)
|
||||
{
|
||||
memset(scissor, 0, sizeof(*scissor));
|
||||
continue;
|
||||
}
|
||||
|
||||
scissor->offset.x = r->left;
|
||||
scissor->offset.y = r->top;
|
||||
scissor->extent.width = r->right - r->left;
|
||||
scissor->extent.height = r->bottom - r->top;
|
||||
}
|
||||
else
|
||||
{
|
||||
scissor->offset.x = viewport->x;
|
||||
scissor->offset.y = viewport->y;
|
||||
scissor->extent.width = viewport->width;
|
||||
scissor->extent.height = viewport->height;
|
||||
}
|
||||
/* Scissor offsets need to be non-negative (VUID-VkPipelineViewportStateCreateInfo-x-02821) */
|
||||
if (scissor->offset.x < 0)
|
||||
scissor->offset.x = 0;
|
||||
if (scissor->offset.y < 0)
|
||||
scissor->offset.y = 0;
|
||||
viewport->y += viewport->height;
|
||||
viewport->height = -viewport->height;
|
||||
}
|
||||
else
|
||||
{
|
||||
key->scissor.offset.x = key->viewport.x;
|
||||
key->scissor.offset.y = key->viewport.y;
|
||||
key->scissor.extent.width = key->viewport.width;
|
||||
key->scissor.extent.height = key->viewport.height;
|
||||
}
|
||||
/* Scissor offsets need to be non-negative (VUID-VkPipelineViewportStateCreateInfo-x-02821) */
|
||||
if (key->scissor.offset.x < 0)
|
||||
key->scissor.offset.x = 0;
|
||||
if (key->scissor.offset.y < 0)
|
||||
key->scissor.offset.y = 0;
|
||||
key->viewport.y += key->viewport.height;
|
||||
key->viewport.height = -key->viewport.height;
|
||||
|
||||
update = true;
|
||||
}
|
||||
|
|
|
@ -2608,8 +2608,8 @@ struct wined3d_graphics_pipeline_key_vk
|
|||
VkVertexInputBindingDivisorDescriptionEXT divisors[MAX_ATTRIBS];
|
||||
VkVertexInputAttributeDescription attributes[MAX_ATTRIBS];
|
||||
VkVertexInputBindingDescription bindings[MAX_ATTRIBS];
|
||||
VkViewport viewport;
|
||||
VkRect2D scissor;
|
||||
VkViewport viewports[WINED3D_MAX_VIEWPORTS];
|
||||
VkRect2D scissors[WINED3D_MAX_VIEWPORTS];
|
||||
VkSampleMask sample_mask;
|
||||
VkPipelineColorBlendAttachmentState blend_attachments[WINED3D_MAX_RENDER_TARGETS];
|
||||
|
||||
|
|
|
@ -223,6 +223,8 @@ struct wined3d_vk_info
|
|||
|
||||
BOOL supported[WINED3D_VK_EXT_COUNT];
|
||||
HMODULE vulkan_lib;
|
||||
|
||||
unsigned int multiple_viewports : 1;
|
||||
};
|
||||
|
||||
#define VK_CALL(f) (vk_info->vk_ops.f)
|
||||
|
|
Loading…
Reference in a new issue