流程式控制制巢狀限制

頂點著色器流程式控制制指令有兩個特殊限制。 巢狀深度會限制可以彼此內呼叫的指令數目。 此外,每個指令都有一個指令位置計數,適用于著色器可支援的指令數目上限。

注意

當您使用 *_4_0_level_9_x HLSL 著色器設定檔時,您會隱含地使用 著色器模型 2.x 設定檔來支援 Direct3D 9 支援的硬體。 著色器模型 2.x 設定檔支援比 著色器模型 4.x 和更新版本的設定檔更有限的流程式控制制行為。

 

每個指令的深度計數vs_2_0

每個指令都會計算一或多個巢狀深度限制。 下表顯示每個指令從現有深度新增或減去的深度計數:

指令 靜態巢狀 動態巢狀 迴圈/rep 巢狀 呼叫巢狀 靜態流程計數
if bool - vs 0 0 0 0 1
if_comp - vs n/a n/a n/a n/a n/a
如果 pred - vs n/a n/a n/a n/a n/a
else - vs 0 0 0 0 1 (bool - 僅限)
endif - vs -1 0 0 0 0
rep - vs 0 0 1 0 1
endrep - vs 0 0 -1 0 0
迴圈 - vs 0 0 1 0 1
endloop - vs 0 0 -1 0 0
break - vs n/a n/a n/a n/a n/a
break_comp - vs n/a n/a n/a n/a n/a
breakp - vs n/a n/a n/a n/a n/a
call - vs 0 0 0 1 1
callnz bool - vs 0 0 0 1 1
callnz pred - vs n/a n/a n/a n/a n/a
ret - vs 0 0 0 -1 0
setp_comp - vs n/a n/a n/a n/a n/a

 

巢狀深度

巢狀深度會定義彼此內可以呼叫多少指令。 每種指令類型都有一或多個巢狀限制:

指令類型 最大值
靜態巢狀 僅受限於靜態流程計數
動態巢狀 n/a
迴圈/rep 巢狀 1
呼叫巢狀 1
靜態流程計數 16

 

每個指令的深度計數vs_2_x

每個指令都會計算一或多個巢狀深度限制。 下表顯示每個指令從現有深度新增或減去的深度計數:

指令 靜態巢狀 動態巢狀 迴圈/rep 巢狀 呼叫巢狀 靜態流程計數
if bool - vs 1 0 0 0 1
if_comp - vs 0 1 0 0 0
如果 pred - vs 0 1 0 0 0
else - vs 0 0 0 0 1 (bool - 僅限)
endif - vs -1 (bool - vs) -1 (pred - vsif_comp - vs) 0 0 0
rep - vs 0 0 1 0 1
endrep - vs 0 0 -1 0 0
迴圈 - vs 0 0 1 0 1
endloop - vs 0 0 -1 0 0
break - vs 0 0 0 0 0
break_comp - vs 0 1, -1 0 0 0
breakp - vs 0 0 0 0 0
call - vs 0 0 0 1 1
callnz bool - vs 0 0 0 1 1
callnz pred - vs 0 1 0 1 0
ret - vs 0 -1 (callnz pred - vs) 0 -1 0
setp_comp - vs 0 0 0 0 0

 

巢狀深度

巢狀深度會定義彼此內可以呼叫多少指令。 每種指令類型都有一或多個巢狀限制:

指令類型 最大值
靜態巢狀 僅受限於靜態流程計數
動態巢狀 0 或 24,請參閱 D3DCAPS9。VS20Caps.DynamicFlowControlDepth
迴圈/rep 巢狀 1 到 4,請參閱 D3DCAPS9。VS20Caps.StaticFlowControlDepth
呼叫巢狀 1 到 4,請參閱 D3DCAPS9。VS20Caps.StaticFlowControlDepth (與迴圈/rep 限制無關)
靜態流程計數 16

 

每個指令的深度計數vs_2_sw

每個指令都會計算一或多個巢狀深度限制。 下表顯示每個指令從現有深度新增或減去的深度計數:

指令 靜態巢狀 動態巢狀 迴圈/rep 巢狀 呼叫巢狀 靜態流程計數
if bool - vs 1 0 0 0 n/a
if_comp - vs 0 1 0 0 n/a
如果 pred - vs 0 1 0 0 n/a
else - vs 0 0 0 0 n/a
endif - vs -1 (bool - vs) -1 (pred - vsif_comp - vs) 0 0 n/a
rep - vs 0 0 1 0 n/a
endrep - vs 0 0 -1 0 n/a
迴圈 - vs 0 0 1 0 n/a
endloop - vs 0 0 -1 0 n/a
break - vs 0 0 0 0 n/a
break_comp - vs 0 1, -1 0 0 n/a
breakp - vs 0 0 0 0 n/a
call - vs 0 0 0 1 n/a
callnz bool - vs 0 0 0 1 n/a
callnz pred - vs 0 1 0 1 n/a
ret - vs 0 -1 (callnz pred - vs) 0 -1 n/a
setp_comp - vs 0 0 0 0 n/a

 

巢狀深度

巢狀深度會定義彼此內可以呼叫多少指令。 每種指令類型都有一或多個巢狀限制:

指令類型 最大值
靜態巢狀 24
動態巢狀 24
迴圈/rep 巢狀 4
呼叫巢狀 4
靜態流程計數 沒有限制

 

每個指令的深度計數vs_3_0

每個指令都會計算一或多個巢狀深度限制。 下表顯示每個指令從現有深度新增或減去的深度計數:

指令 靜態巢狀 動態巢狀 迴圈/rep 巢狀 呼叫巢狀 靜態流程計數
if bool - vs 1 0 0 0 n/a
if_comp - vs 0 1 0 0 n/a
如果 pred - vs 0 1 0 0 n/a
else - vs 0 0 0 0 n/a
endif - vs -1 (bool - vs) -1 (pred - vsif_comp - vs) 0 0 n/a
rep - vs 0 0 1 0 n/a
endrep - vs 0 0 -1 0 n/a
迴圈 - vs 0 0 1 0 n/a
endloop - vs 0 0 -1 0 n/a
break - vs 0 0 0 0 n/a
break_comp - vs 0 1, -1 0 0 n/a
breakp - vs 0 0 0 0 n/a
call - vs 0 0 0 1 n/a
callnz bool - vs 0 0 0 1 n/a
callnz pred - vs 0 1 0 1 n/a
ret - vs 0 -1 (callnz pred - vs) 0 -1 n/a
setp_comp - vs 0 0 0 0 n/a

 

巢狀深度

巢狀深度會定義彼此內可以呼叫多少指令。 每種指令類型都有一或多個巢狀限制:

指令類型 最大值
靜態巢狀 24
動態巢狀 24
迴圈/rep 巢狀 4
呼叫巢狀 4
靜態流程計數 沒有限制

 

每個指令的深度計數vs_3_sw

每個指令都會計算一或多個巢狀深度限制。 下表顯示每個指令從現有深度新增或減去的深度計數:

指令 靜態巢狀 動態巢狀 迴圈/rep 巢狀 呼叫巢狀 靜態流程計數
if bool - vs 1 0 0 0 n/a
if_comp - vs 0 1 0 0 n/a
如果 pred - vs 0 1 0 0 n/a
else - vs 0 0 0 0 n/a
endif - vs -1 (bool - vs) -1 (pred - vsif_comp - vs) 0 0 n/a
rep - vs 0 0 1 0 n/a
endrep - vs 0 0 -1 0 n/a
迴圈 - vs 0 0 1 0 n/a
endloop - vs 0 0 -1 0 n/a
break - vs 0 0 0 0 n/a
break_comp - vs 0 1, -1 0 0 n/a
breakp - vs 0 0 0 0 n/a
call - vs 0 0 0 1 n/a
callnz bool - vs 0 0 0 1 n/a
callnz pred - vs 0 1 0 1 n/a
ret - vs 0 -1 (callnz pred - vs) 0 -1 n/a
setp_comp - vs 0 0 0 0 n/a

 

巢狀深度

巢狀深度會定義彼此內可以呼叫多少指令。 每種指令類型都有一或多個巢狀限制:

指令類型 最大值
靜態巢狀 24
動態巢狀 24
迴圈/rep 巢狀 4
呼叫巢狀 4
靜態流程計數 沒有限制

 

頂點著色器指示