[[vertexpostproc-viewportwscaling]]
== Controlling Viewport W Scaling

If viewport W scaling is enabled, the W component of the clip coordinate is
modified by the provided coefficients from the corresponding viewport as
follows.

  :: [eq]#w~c~' = x~coeff~ x~c~ + y~coeff~ y~c~ + w~c~#

// refBegin VkPipelineViewportWScalingStateCreateInfoNV Structure specifying parameters of a newly created pipeline viewport W scaling state

The sname:VkPipelineViewportWScalingStateCreateInfoNV structure is defined
as:

include::../../api/structs/VkPipelineViewportWScalingStateCreateInfoNV.txt[]

  * pname:sType is the type of this structure
  * pname:pNext is `NULL` or a pointer to an extension-specific structure
  * pname:viewportWScalingEnable is the enable for viewport W scaling
  * pname:viewportCount is the number of viewports used by W scaling and
    must: match the number of viewports in the pipeline if viewport W
    scaling is enabled.
  * pname:pViewportWScalings is a pointer to an array of
    sname:VkViewportWScalingNV structures which define the W scaling
    parameters for the corresponding viewport.
    If the viewport W scaling state is dynamic, this member is ignored.
  * If no element of the pname:pDynamicStates member of
    sname::VkPipelineViewportStateCreateInfo::pname:pDynamicState is
    ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV, the
    pname:pViewportScalings member of a
    sname:VkPipelineViewportWScalingStateCreateInfoNV extension structure
    must: be a pointer to an array of
    sname:VkPipelineViewportWScalingStateCreateInfoNV::pname:viewportCount
    sname:VkViewportWScalingNV structures

.Valid Usage
****
  * [[VUID-VkPipelineViewportWScalingStateCreateInfoNV-viewportWScalingEnable-01319]]
    If the <<features-features-multiViewport,multiple viewports>> feature is
    not enabled and pname:viewportWScalingEnable is ename:VK_TRUE,
    pname:viewportCount must: be `1`
  * [[VUID-VkPipelineViewportWScalingStateCreateInfoNV-viewportCount-01320]]
    pname:viewportCount must: be between `1` and
    sname:VkPhysicalDeviceLimits::pname:maxViewports, inclusive if
    pname:viewportWScalingEnable is ename:VK_TRUE
  * [[VUID-VkPipelineViewportWScalingStateCreateInfoNV-viewportCount-01321]]
    pname:viewportCount and
    sname:VkPipelineViewportStateCreateInfo::pname:viewportCount must: be
    identical if pname:viewportWScalingEnable is ename:VK_TRUE
****

include::../../validity/structs/VkPipelineViewportWScalingStateCreateInfoNV.txt[]

The sname:VkPipelineViewportWScalingStateCreateInfoNV state is set by adding
an instance of this structure to the pname:pNext chain of an instance of the
sname:VkPipelineViewportStateCreateInfo structure and setting the graphics
pipeline state with flink:vkCreateGraphicsPipelines.

// refBegin vkCmdSetViewportWScalingNV Set the viewport W scaling on a command buffer

If the bound pipeline state object was not created with the
ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV dynamic state enabled, viewport
W scaling parameters are specified using the pname:pViewportWScalings member
of sname:VkPipelineViewportWScalingStateCreateInfoNV in the pipeline state
object.
If the pipeline state object was created with the
ename:VK_DYNAMIC_STATE_VIEWPORT dynamic state enabled, the viewport
transformation parameters are dynamically set and changed with the command:

include::../../api/protos/vkCmdSetViewportWScalingNV.txt[]

  * pname:commandBuffer is the command buffer into which the command will be
    recorded.
  * pname:firstViewport is the index of the first viewport whose parameters
    are updated by the command.
  * pname:viewportCount is the number of viewports whose parameters are
    updated by the command.
  * pname:pViewportScalings is a pointer to an array of
    slink:VkViewportWScalingNV structures specifying viewport parameters.

The viewport parameters taken from element [eq]#i# of
pname:pViewportScalings replace the current state for the viewport index
[eq]#pname:firstViewport {plus} i#, for [eq]#i# in [eq]#[0,
pname:viewportCount)#.

.Valid Usage
****
  * [[VUID-vkCmdSetViewportWScalingNV-None-01322]]
    The currently bound graphics pipeline must: have been created with the
    ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV dynamic state enabled
  * [[VUID-vkCmdSetViewportWScalingNV-firstViewport-01323]]
    pname:firstViewport must: be less than
    sname:VkPhysicalDeviceLimits::pname:maxViewports
  * [[VUID-vkCmdSetViewportWScalingNV-firstViewport-01324]]
    The sum of pname:firstViewport and pname:viewportCount must: be between
    `1` and sname:VkPhysicalDeviceLimits::pname:maxViewports, inclusive
  * [[VUID-vkCmdSetViewportWScalingNV-pViewportScalings-01325]]
    pname:pViewportScalings must: be a pointer to an array of
    pname:viewportCount valid sname:VkViewportWScalingNV structures
****

include::../../validity/protos/vkCmdSetViewportWScalingNV.txt[]

Both slink:VkPipelineViewportWScalingStateCreateInfoNV and
flink:vkCmdSetViewportWScalingNV use sname:VkViewportWScalingNV to set the
viewport transformation parameters.

// refBegin VkViewportWScalingNV Structure specifying a viewport

The sname:VkViewportWScalingNV structure is defined as:

include::../../api/structs/VkViewportWScalingNV.txt[]

  * pname:xcoeff and pname:ycoeff are the viewport's W scaling factor for x
    and y respectively.

include::../../validity/structs/VkViewportWScalingNV.txt[]
