[[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~ {plus} y~coeff~ y~c~ {plus} w~c~# [open,refpage='VkPipelineViewportWScalingStateCreateInfoNV',desc='Structure specifying parameters of a newly created pipeline viewport W scaling state',type='structs'] -- The sname:VkPipelineViewportWScalingStateCreateInfoNV structure is defined as: include::{generated}/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 controls whether viewport *W* scaling is enabled. * 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. include::{generated}/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. [open,refpage='vkCmdSetViewportWScalingNV',desc='Set the viewport W scaling on a command buffer',type='protos'] -- 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 slink:VkPipelineViewportWScalingStateCreateInfoNV in the pipeline state object. If the pipeline state object was created with the ename:VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV dynamic state enabled, the viewport transformation parameters are dynamically set and changed with the command: include::{generated}/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:pViewportWScalings is a pointer to an array of slink:VkViewportWScalingNV structures specifying viewport parameters. The viewport parameters taken from element [eq]#i# of pname:pViewportWScalings 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 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 slink:VkPhysicalDeviceLimits::pname:maxViewports * [[VUID-vkCmdSetViewportWScalingNV-firstViewport-01324]] The sum of pname:firstViewport and pname:viewportCount must: be between `1` and slink:VkPhysicalDeviceLimits::pname:maxViewports, inclusive **** include::{generated}/validity/protos/vkCmdSetViewportWScalingNV.txt[] -- Both slink:VkPipelineViewportWScalingStateCreateInfoNV and flink:vkCmdSetViewportWScalingNV use sname:VkViewportWScalingNV to set the viewport transformation parameters. [open,refpage='VkViewportWScalingNV',desc='Structure specifying a viewport',type='structs'] -- The sname:VkViewportWScalingNV structure is defined as: include::{generated}/api/structs/VkViewportWScalingNV.txt[] * pname:xcoeff and pname:ycoeff are the viewport's W scaling factor for x and y respectively. include::{generated}/validity/structs/VkViewportWScalingNV.txt[] --