• 《Creating Your First XboxOne Application》


    The following sections provide a tutorial on how to create a program to render a triangle on the Xbox One dev kit:

    Creating a project

    First, create a new project for Xbox One by using a template supplied with the XDK.

    To create a new project

    1. On your development PC create a new Visual C++ project using the Durango platform and Direct3D Game template.

      Do not use spaces or other non-alphanumeric characters in the project name

    Adding pixel and vertex shaders

    Next, add source code for the pixel shader and the vertex shader.

    To add source code for a pixel shader

    1. Select the project in Solution Explorer.
    2. On the Project menu, click Add New Item.
    3. Select HLSL in the tree, and then select Pixel Shader File (.hlsl).

    4. Click Add.
    5. Replace the default code for the pixel shader with the following:

        struct Interpolants
        {
          float4 position : SV_POSITION0;
          float4 color    : COLOR0;
        };
      
        struct Pixel
        {
          float4 color    : SV_TARGET0;
        };
      
        Pixel main( Interpolants In )
        {
          Pixel Out;
          Out.color = In.color;
          return Out;
        }
      
    6. Right-click PixelShader.hlsl in Solution Explorer and choose Properties from the context menu.
    7. For Configuration, select All Configurations, and then select HLSL CompilerAll Options in the tree control.

    8. Set Header File Name to PixelShader.h. 这里的设定表示该hlsl文件会变成那个.h文件;工程在build的时候会自动根据这个hlsl文件生成这个头文件
    9. Set Header Variable Name to g_ps_main. 在上一步中会生成的头文件中会有一个数组存储shader的代码,这个变量就是这个数组的名字,后面根据的CreateResource()函数,创建shader(CreateVertexShader和CreatePixelShader)的时候,会引用这个数组名;
    10. Clear the value for Object File Name.
    11. Set Shader Model to Shader Model 5 (/5_0).

    12. Verify your changes, and then click OK.

    To add source code for a vertex shader

    1. Select the project in Solution Explorer.
    2. On the Project menu, click Add New Item.
    3. Select HLSL in the Add New Item dialog box, and select Vertex Shader File (.hlsl).

    4. Click Add.
    5. Replace the default code for the vertex shader code with the following code.

        struct Vertex
        {
          float4 position     : POSITION0;
          float4 color        : COLOR0;
        };
      
        struct Interpolants
        {
          float4 position     : SV_POSITION0;
          float4 color        : COLOR0;
        };
      
        Interpolants main( Vertex In )
        {
          return In;
        }
      
    6. Right-click VertexShader.hlsl in Solution Explorer and choose Properties from the context menu.
    7. Select All Configurations for Configurations, and then select HLSL CompilerAll Options in the tree control.
    8. Set Header File Name to VertexShader.h.
    9. Set Header Variable Name to g_vs_main.
    10. Clear the value for Object File Name.
    11. Set Shader Model to Shader Model 5 (/5_0).
    12. Verify your changes, and then click OK.

    13. Add the following include statements to game.cpp:
        #include "PixelShader.h"
        #include "VertexShader.h"
       注意这里虽然新增了两行去包含两个文件,但是在工程中现在这两个文件是不存在的,这两个文件会在全部配置完成后编译工程成功后可以由hlsl shader compiler为durango平台自动生成,比如该工程生成的两个文件的内容是:
    #if 0
    //
    // Generated by Microsoft (R) HLSL Shader Compiler For Durango
    //
    //
    //
    // Input signature:
    //
    // Name                 Index   Mask Register SysValue  Format   Used
    // -------------------- ----- ------ -------- -------- ------- ------
    // POSITION                 0   xyzw        0     NONE   float   xyzw
    // COLOR                    0   xyzw        1     NONE   float   xyzw
    //
    //
    // Output signature:
    //
    // Name                 Index   Mask Register SysValue  Format   Used
    // -------------------- ----- ------ -------- -------- ------- ------
    // SV_POSITION              0   xyzw        0      POS   float   xyzw
    // COLOR                    0   xyzw        1     NONE   float   xyzw
    //
    vs_5_0
    // Opaque Custom Data - XBOX Precompiled Shader Header
    // First Precompiled Shader at offset:[32]
    // Embedded Data:
    //  0x00000020 - Offset To First Precompiled Shader
    //  0x00010050 - Original Shader Descriptor
    //  0x0000001b - Original Shader Size
    dcl_globalFlags refactoringAllowed | skipOptimization
    dcl_input v0.xyzw
    dcl_input v1.xyzw
    dcl_output_siv o0.xyzw, position
    dcl_output o1.xyzw
    //
    // Initial variable locations:
    //   v0.x <- In.position.x; v0.y <- In.position.y; v0.z <- In.position.z; v0.w <- In.position.w; 
    //   v1.x <- In.color.x; v1.y <- In.color.y; v1.z <- In.color.z; v1.w <- In.color.w; 
    //   o1.x <- <main return value>.color.x; o1.y <- <main return value>.color.y; o1.z <- <main return value>.color.z; o1.w <- <main return value>.color.w; 
    //   o0.x <- <main return value>.position.x; o0.y <- <main return value>.position.y; o0.z <- <main return value>.position.z; o0.w <- <main return value>.position.w
    //
    #line 21 "C:UserswangsongweiDesktopDurangoGameDurangoGameVertexShader1.hlsl"
    mov o0.xyzw, v0.xyzw
    mov o1.xyzw, v1.xyzw
    ret 
    // Opaque Custom Data - XBOX Precompiled Shader Object
    // Offset:[32], bundle is:[126] DWORDS.
    // Disassembled Precompiled Shader Object:
    // Shader Type               : (VS)
    // Shader Hw Stage           : (VS)
    // HLSL Source Filename      : C:UserswangsongweiDesktopDurangoGameDurangoGameVertexShader1.hlsl
    // HLSL Entrypoint Name      : main
    // __XBOX_SHADER_UNIQUE_HASH : 0x9fc1b81a
    // Shader Semantic Hash      : 0xa4ddca041f70c960
    //
    // Shader Data:
    // ----------------- VS Data ------------------------
    ; Input Semantic Mappings
    ;   [0] generic, usageIdx  0, channelMask 15, v[4:7]
    ;   [1] generic, usageIdx  1, channelMask 15, v[8:11]
    ; Output Semantic Mappings
    ;   [0] generic, usageIdx  1, paramIdx 0, paramSlot 0
    
    codeLenInByte        = 28 bytes;
    
    ; launchModeFlags    = 0x0000000E
    srdTableSupport      = TRUE
    immediateSupportExt  = TRUE
    srdTableSupportExt   = TRUE
    
    userElementCount     = 2;
    ;  userElements[0]      = PTR_VERTEX_BUFFER_TABLE, Element=1 dwords, s[2:3]
    ;  userElements[1]      = SUB_PTR_FETCH_SHADER, s[2:3]
    extUserElementCount  = 0;
    NumVgprs             = 12;
    NumSgprs             = 5;
    FloatMode            = 192;
    IeeeMode             = 0;
    FlatPtr32            = 0;
    ScratchSize          = 0 dwords/thread;
    LDSByteSize          = 0 bytes/workgroup (compile time only);
    ScratchWaveOffsetReg = s65535;
    ; texSamplerUsage         = 0x00000000
    ; constBufUsage           = 0x00000000
    
    ; SPI_SHADER_PGM_RSRC2_VS = 0x00000008
    SSPRV:USER_SGPR             = 4
    ; PA_CL_VS_OUT_CNTL       = 0x00000000
    ; SPI_VS_OUT_CONFIG       = 0x00000000
    SVOC:VS_EXPORT_COUNT        = 0
    SVOC:VS_HALF_PACK           = 0
    SVOC:VS_EXPORTS_FOG         = 0
    SVOC:VS_OUT_FOG_VEC_ADDR    = 0
    ; SPI_SHADER_POS_FORMAT     = 0x00000004
    SSPF:POS0_EXPORT_FORMAT     = 4
    SSPF:POS1_EXPORT_FORMAT     = 0
    SSPF:POS2_EXPORT_FORMAT     = 0
    SSPF:POS3_EXPORT_FORMAT     = 0
    VGT_STRMOUT_CONFIG = 0x0
    VGT_STRMOUT_CONFIG:RAST_STREAM = 0
    VGT_STRMOUT_CONFIG:STREAMOUT_0_EN = 0
    VGT_STRMOUT_CONFIG:STREAMOUT_1_EN = 0
    VGT_STRMOUT_CONFIG:STREAMOUT_2_EN = 0
    VGT_STRMOUT_CONFIG:STREAMOUT_3_EN = 0
    ; exportVertexSize          = 4
    
    // Shader Instructions:
    shader main
      asic(CI)
      type(VS)
      s_swappc_b64  s[2:3], s[2:3]                          // 000000000000: BE822102
      s_waitcnt     vmcnt(0) & lgkmcnt(15)                  // 000000000004: BF8C0F70
      exp           pos0, v4, v5, v6, v7 done               // 000000000008: F80008CF 07060504
      exp           param0, v8, v9, v10, v11                // 000000000010: F800020F 0B0A0908
      s_endpgm                                              // 000000000018: BF810000
    end
    
    
    // Shader Statistics:
    //  NumActiveWaveFront:         40
    //  WorkgroupSize:              64
    //  NumVRegs:                   12
    //  NumSRegs:                   4
    //  NumActiveWaveFrontByVReg:   40
    //  NumActiveWaveFrontBySReg:   40
    //  NumActiveWaveFrontByLDS:    40
    //  CycleSim:                   82
    //  CycleSimNWaves:             82
    //  Code Size:                  28
    //Assembler Counts:
    //  num_32bit_ops                     : 3
    //  num_64bit_ops                     : 2
    //  num_alu                           : 0
    //  num_fc                            : 3
    //  num_inst_exp                      : 2
    //  num_inst_ldsgds                   : 0
    //  num_inst_mimg                     : 0
    //  num_inst_mtbuf                    : 0
    //  num_inst_mubuf                    : 0
    //  num_inst_sopp                     : 2
    //  num_inst_sopc                     : 0
    //  num_inst_sop1                     : 1
    //  num_inst_sop2                     : 0
    //  num_inst_smrd                     : 0
    //  num_inst_sopk                     : 0
    //  num_inst_vop1                     : 0
    //  num_inst_vop2                     : 0
    //  num_inst_vop3                     : 0
    //  num_inst_vopc                     : 0
    //  num_inst_vintrp                   : 0
    //  constant_literal_operands         : 0
    //  num_tex                           : 2
    //  num_vmem_group                    : 0
    //  vmem_grouping_started             : 0
    // Shader Statistics:
    // m_uNumActiveWaveFront             : 40
    // m_uVRegLimit                      : 256
    // m_uSRegLimit                      : 512
    // m_uNumVRegs                       : 12
    // m_uNumSRegs                       : 4
    // m_uSCCodeSize                     : 28
    // m_uWorkgroupSize                  : 64
    // m_uNumActiveWaveFrontByVReg       : 40
    // m_uNumActiveWaveFrontBySReg       : 40
    // m_uNumActiveWaveFrontByLDS        : 40
    // m_uCycleSim1Wave                  : 82
    // m_uCycleSimNWaves                 : 82
    
    // Assembler Counts:
    // num_32bit_ops                     : 3
    // num_64bit_ops                     : 2
    // num_alu                           : 0
    // num_fc                            : 3
    // num_inst_exp                      : 2
    // num_inst_ldsgds                   : 0
    // num_inst_mimg                     : 0
    // num_inst_mtbuf                    : 0
    // num_inst_mubuf                    : 0
    // num_inst_sopp                     : 2
    // num_inst_sopc                     : 0
    // num_inst_sop1                     : 1
    // num_inst_sop2                     : 0
    // num_inst_smrd                     : 0
    // num_inst_sopk                     : 0
    // num_inst_vop1                     : 0
    // num_inst_vop2                     : 0
    // num_inst_vop3                     : 0
    // num_inst_vopc                     : 0
    // num_inst_vintrp                   : 0
    // num_inst_smem                     : 0
    // constant_literal_operands         : 0
    // num_tex                           : 2
    // num_vmem_group                    : 0
    // vmem_grouping_started             : 0
    // m_fFullPrecompilePromise          : 0
    // m_fIntegerDivideExpansion         : 0
    // m_fIntegerModExpansion            : 0
    // m_fDoubleDivideExpansion          : 0
    // m_fUsesScratch                    : 0
    // m_fPerThreadIndirection           : 0
    // m_fUsingTableLoads                : 0
    // m_fUsingSHmemLoads                : 0
    // fSemanticHashFlagOverrideApplied  : 0
    // fPSHasNoUAVWrite                  : 0
    // version                           : 2
    // fCodePatched                      : 0
    
    // Opaque Custom Data - XBOX Precompiled Shader Object
    // Offset:[160], bundle is:[137] DWORDS.
    // Disassembled Precompiled Shader Object:
    // Shader Type               : (VS)
    // Shader Hw Stage           : (ES)
    // HLSL Source Filename      : C:UserswangsongweiDesktopDurangoGameDurangoGameVertexShader1.hlsl
    // HLSL Entrypoint Name      : main
    // __XBOX_SHADER_UNIQUE_HASH : 0x9fc1b81a
    // Shader Semantic Hash      : 0xa4ddca041f70c960
    //
    // Shader Data:
    // ----------------- VS Data ------------------------
    ; Input Semantic Mappings
    ;   [0] generic, usageIdx  0, channelMask 15, v[4:7]
    ;   [1] generic, usageIdx  1, channelMask 15, v[8:11]
    ; Output Semantic Mappings
    ;   [0] position, usageIdx  0, paramIdx 0, paramSlot 0
    ;   [1] generic, usageIdx  1, paramIdx 1, paramSlot 0
    
    codeLenInByte        = 80 bytes;
    
    ; launchModeFlags    = 0x0000000E
    srdTableSupport      = TRUE
    immediateSupportExt  = TRUE
    srdTableSupportExt   = TRUE
    
    userElementCount     = 4;
    ;  userElements[0]      = PTR_VERTEX_BUFFER_TABLE, Element=1 dwords, s[2:3]
    ;  userElements[1]      = PTR_EXTENDED_USER_DATA, ReferencedExtUserElements=1, s[2:3]
    ;  userElements[2]      = PTR_INTERNAL_GLOBAL_TABLE, Element=1 dwords, s[2:3]
    ;  userElements[3]      = SUB_PTR_FETCH_SHADER, s[2:3]
    extUserElementCount  = 0;
    NumVgprs             = 12;
    NumSgprs             = 6;
    FloatMode            = 192;
    IeeeMode             = 0;
    FlatPtr32            = 0;
    ScratchSize          = 0 dwords/thread;
    LDSByteSize          = 0 bytes/workgroup (compile time only);
    ScratchWaveOffsetReg = s65535;
    ; texSamplerUsage         = 0x00000000
    ; constBufUsage           = 0x00000000
    
    ; SPI_SHADER_PGM_RSRC2_VS = 0x00000008
    SSPRV:USER_SGPR             = 4
    ; PA_CL_VS_OUT_CNTL       = 0x00000000
    ; SPI_VS_OUT_CONFIG       = 0x00000000
    SVOC:VS_EXPORT_COUNT        = 0
    SVOC:VS_HALF_PACK           = 0
    SVOC:VS_EXPORTS_FOG         = 0
    SVOC:VS_OUT_FOG_VEC_ADDR    = 0
    ; SPI_SHADER_POS_FORMAT     = 0x00000004
    SSPF:POS0_EXPORT_FORMAT     = 4
    SSPF:POS1_EXPORT_FORMAT     = 0
    SSPF:POS2_EXPORT_FORMAT     = 0
    SSPF:POS3_EXPORT_FORMAT     = 0
    VGT_STRMOUT_CONFIG = 0x0
    VGT_STRMOUT_CONFIG:RAST_STREAM = 0
    VGT_STRMOUT_CONFIG:STREAMOUT_0_EN = 0
    VGT_STRMOUT_CONFIG:STREAMOUT_1_EN = 0
    VGT_STRMOUT_CONFIG:STREAMOUT_2_EN = 0
    VGT_STRMOUT_CONFIG:STREAMOUT_3_EN = 0
    ; exportVertexSize          = 8
    ; esGsRingItemSize          = 8
    
    // Shader Instructions:
    shader main
      asic(CI)
      type(VS)
      s_swappc_b64  s[2:3], s[2:3]                          // 000000000000: BE822102
      s_load_dwordx4  s[0:3], s[2:3], 0x08                  // 000000000004: C0800308
      s_waitcnt     vmcnt(0) & lgkmcnt(0)                   // 000000000008: BF8C0070
      buffer_store_dword  v4, v0, s[0:3], s4 glc slc        // 00000000000C: E0704000 04400400
      buffer_store_dword  v5, v0, s[0:3], s4 offset:4 glc slc // 000000000014: E0704004 04400500
      buffer_store_dword  v6, v0, s[0:3], s4 offset:8 glc slc // 00000000001C: E0704008 04400600
      buffer_store_dword  v7, v0, s[0:3], s4 offset:12 glc slc // 000000000024: E070400C 04400700
      buffer_store_dword  v8, v0, s[0:3], s4 offset:16 glc slc // 00000000002C: E0704010 04400800
      buffer_store_dword  v9, v0, s[0:3], s4 offset:20 glc slc // 000000000034: E0704014 04400900
      buffer_store_dword  v10, v0, s[0:3], s4 offset:24 glc slc // 00000000003C: E0704018 04400A00
      buffer_store_dword  v11, v0, s[0:3], s4 offset:28 glc slc // 000000000044: E070401C 04400B00
      s_endpgm                                              // 00000000004C: BF810000
    end
    
    
    // Shader Statistics:
    //  NumActiveWaveFront:         40
    //  WorkgroupSize:              64
    //  NumVRegs:                   12
    //  NumSRegs:                   5
    //  NumActiveWaveFrontByVReg:   40
    //  NumActiveWaveFrontBySReg:   40
    //  NumActiveWaveFrontByLDS:    40
    //  CycleSim:                   85
    //  CycleSimNWaves:             85
    //  Code Size:                  80
    //Assembler Counts:
    //  num_32bit_ops                     : 4
    //  num_64bit_ops                     : 8
    //  num_alu                           : 0
    //  num_fc                            : 4
    //  num_inst_exp                      : 0
    //  num_inst_ldsgds                   : 0
    //  num_inst_mimg                     : 0
    //  num_inst_mtbuf                    : 0
    //  num_inst_mubuf                    : 8
    //  num_inst_sopp                     : 2
    //  num_inst_sopc                     : 0
    //  num_inst_sop1                     : 1
    //  num_inst_sop2                     : 0
    //  num_inst_smrd                     : 0
    //  num_inst_sopk                     : 0
    //  num_inst_vop1                     : 0
    //  num_inst_vop2                     : 0
    //  num_inst_vop3                     : 0
    //  num_inst_vopc                     : 0
    //  num_inst_vintrp                   : 0
    //  constant_literal_operands         : 0
    //  num_tex                           : 8
    //  num_vmem_group                    : 1
    //  vmem_grouping_started             : 0
    // Shader Statistics:
    // m_uNumActiveWaveFront             : 40
    // m_uVRegLimit                      : 256
    // m_uSRegLimit                      : 512
    // m_uNumVRegs                       : 12
    // m_uNumSRegs                       : 5
    // m_uSCCodeSize                     : 80
    // m_uWorkgroupSize                  : 64
    // m_uNumActiveWaveFrontByVReg       : 40
    // m_uNumActiveWaveFrontBySReg       : 40
    // m_uNumActiveWaveFrontByLDS        : 40
    // m_uCycleSim1Wave                  : 85
    // m_uCycleSimNWaves                 : 85
    
    // Assembler Counts:
    // num_32bit_ops                     : 4
    // num_64bit_ops                     : 8
    // num_alu                           : 0
    // num_fc                            : 4
    // num_inst_exp                      : 0
    // num_inst_ldsgds                   : 0
    // num_inst_mimg                     : 0
    // num_inst_mtbuf                    : 0
    // num_inst_mubuf                    : 8
    // num_inst_sopp                     : 2
    // num_inst_sopc                     : 0
    // num_inst_sop1                     : 1
    // num_inst_sop2                     : 0
    // num_inst_smrd                     : 0
    // num_inst_sopk                     : 0
    // num_inst_vop1                     : 0
    // num_inst_vop2                     : 0
    // num_inst_vop3                     : 0
    // num_inst_vopc                     : 0
    // num_inst_vintrp                   : 0
    // num_inst_smem                     : 1
    // constant_literal_operands         : 0
    // num_tex                           : 8
    // num_vmem_group                    : 1
    // vmem_grouping_started             : 0
    // m_fFullPrecompilePromise          : 0
    // m_fIntegerDivideExpansion         : 0
    // m_fIntegerModExpansion            : 0
    // m_fDoubleDivideExpansion          : 0
    // m_fUsesScratch                    : 0
    // m_fPerThreadIndirection           : 0
    // m_fUsingTableLoads                : 0
    // m_fUsingSHmemLoads                : 0
    // fSemanticHashFlagOverrideApplied  : 0
    // fPSHasNoUAVWrite                  : 0
    // version                           : 2
    // fCodePatched                      : 0
    
    // Opaque Custom Data - XBOX Precompiled Shader Object
    // Offset:[299], bundle is:[132] DWORDS.
    // Disassembled Precompiled Shader Object:
    // Shader Type               : (VS)
    // Shader Hw Stage           : (LS)
    // HLSL Source Filename      : C:UserswangsongweiDesktopDurangoGameDurangoGameVertexShader1.hlsl
    // HLSL Entrypoint Name      : main
    // __XBOX_SHADER_UNIQUE_HASH : 0x9fc1b81a
    // Shader Semantic Hash      : 0xa4ddca041f70c960
    //
    // Shader Data:
    // ----------------- VS Data ------------------------
    ; Input Semantic Mappings
    ;   [0] generic, usageIdx  0, channelMask 15, v[4:7]
    ;   [1] generic, usageIdx  1, channelMask 15, v[8:11]
    ; Output Semantic Mappings
    ;   [0] position, usageIdx  0, paramIdx 0, paramSlot 0
    ;   [1] generic, usageIdx  1, paramIdx 1, paramSlot 0
    
    codeLenInByte        = 56 bytes;
    
    ; launchModeFlags    = 0x0000000E
    srdTableSupport      = TRUE
    immediateSupportExt  = TRUE
    srdTableSupportExt   = TRUE
    
    userElementCount     = 2;
    ;  userElements[0]      = PTR_VERTEX_BUFFER_TABLE, Element=1 dwords, s[2:3]
    ;  userElements[1]      = SUB_PTR_FETCH_SHADER, s[2:3]
    extUserElementCount  = 0;
    NumVgprs             = 12;
    NumSgprs             = 5;
    FloatMode            = 192;
    IeeeMode             = 0;
    FlatPtr32            = 0;
    ScratchSize          = 0 dwords/thread;
    LDSByteSize          = 0 bytes/workgroup (compile time only);
    ScratchWaveOffsetReg = s65535;
    ; texSamplerUsage         = 0x00000000
    ; constBufUsage           = 0x00000000
    
    ; SPI_SHADER_PGM_RSRC2_VS = 0x00000008
    SSPRV:USER_SGPR             = 4
    ; PA_CL_VS_OUT_CNTL       = 0x00000000
    ; SPI_VS_OUT_CONFIG       = 0x00000000
    SVOC:VS_EXPORT_COUNT        = 0
    SVOC:VS_HALF_PACK           = 0
    SVOC:VS_EXPORTS_FOG         = 0
    SVOC:VS_OUT_FOG_VEC_ADDR    = 0
    ; SPI_SHADER_POS_FORMAT     = 0x00000004
    SSPF:POS0_EXPORT_FORMAT     = 4
    SSPF:POS1_EXPORT_FORMAT     = 0
    SSPF:POS2_EXPORT_FORMAT     = 0
    SSPF:POS3_EXPORT_FORMAT     = 0
    VGT_STRMOUT_CONFIG = 0x0
    VGT_STRMOUT_CONFIG:RAST_STREAM = 0
    VGT_STRMOUT_CONFIG:STREAMOUT_0_EN = 0
    VGT_STRMOUT_CONFIG:STREAMOUT_1_EN = 0
    VGT_STRMOUT_CONFIG:STREAMOUT_2_EN = 0
    VGT_STRMOUT_CONFIG:STREAMOUT_3_EN = 0
    ; vgprCompCnt               = 1
    ; exportVertexSize          = 8
    ; lsStride                  = 32
    
    // Shader Instructions:
    shader main
      asic(CI)
      type(VS)
      s_swappc_b64  s[2:3], s[2:3]                          // 000000000000: BE822102
      s_mov_b32     m0, 0x00010000                          // 000000000004: BEFC03FF 00010000
      s_waitcnt     vmcnt(0) & lgkmcnt(15)                  // 00000000000C: BF8C0F70
      v_lshlrev_b32  v0, 5, v1                              // 000000000010: 34000285
      ds_write2_b32  v0, v4, v5 offset1:1                   // 000000000014: D8380100 00050400
      ds_write2_b32  v0, v6, v7 offset0:2 offset1:3         // 00000000001C: D8380302 00070600
      ds_write2_b32  v0, v8, v9 offset0:4 offset1:5         // 000000000024: D8380504 00090800
      ds_write2_b32  v0, v10, v11 offset0:6 offset1:7       // 00000000002C: D8380706 000B0A00
      s_endpgm                                              // 000000000034: BF810000
    end
    
    
    // Shader Statistics:
    //  NumActiveWaveFront:         40
    //  WorkgroupSize:              64
    //  NumVRegs:                   12
    //  NumSRegs:                   4
    //  NumActiveWaveFrontByVReg:   40
    //  NumActiveWaveFrontBySReg:   40
    //  NumActiveWaveFrontByLDS:    40
    //  CycleSim:                   80
    //  CycleSimNWaves:             80
    //  Code Size:                  56
    //Assembler Counts:
    //  num_32bit_ops                     : 5
    //  num_64bit_ops                     : 4
    //  num_alu                           : 1
    //  num_fc                            : 4
    //  num_inst_exp                      : 0
    //  num_inst_ldsgds                   : 4
    //  num_inst_mimg                     : 0
    //  num_inst_mtbuf                    : 0
    //  num_inst_mubuf                    : 0
    //  num_inst_sopp                     : 2
    //  num_inst_sopc                     : 0
    //  num_inst_sop1                     : 2
    //  num_inst_sop2                     : 0
    //  num_inst_smrd                     : 0
    //  num_inst_sopk                     : 0
    //  num_inst_vop1                     : 0
    //  num_inst_vop2                     : 1
    //  num_inst_vop3                     : 0
    //  num_inst_vopc                     : 0
    //  num_inst_vintrp                   : 0
    //  constant_literal_operands         : 0
    //  num_tex                           : 4
    //  num_vmem_group                    : 0
    //  vmem_grouping_started             : 0
    // Shader Statistics:
    // m_uNumActiveWaveFront             : 40
    // m_uVRegLimit                      : 256
    // m_uSRegLimit                      : 512
    // m_uNumVRegs                       : 12
    // m_uNumSRegs                       : 4
    // m_uSCCodeSize                     : 56
    // m_uWorkgroupSize                  : 64
    // m_uNumActiveWaveFrontByVReg       : 40
    // m_uNumActiveWaveFrontBySReg       : 40
    // m_uNumActiveWaveFrontByLDS        : 40
    // m_uCycleSim1Wave                  : 80
    // m_uCycleSimNWaves                 : 80
    
    // Assembler Counts:
    // num_32bit_ops                     : 5
    // num_64bit_ops                     : 4
    // num_alu                           : 1
    // num_fc                            : 4
    // num_inst_exp                      : 0
    // num_inst_ldsgds                   : 4
    // num_inst_mimg                     : 0
    // num_inst_mtbuf                    : 0
    // num_inst_mubuf                    : 0
    // num_inst_sopp                     : 2
    // num_inst_sopc                     : 0
    // num_inst_sop1                     : 2
    // num_inst_sop2                     : 0
    // num_inst_smrd                     : 0
    // num_inst_sopk                     : 0
    // num_inst_vop1                     : 0
    // num_inst_vop2                     : 1
    // num_inst_vop3                     : 0
    // num_inst_vopc                     : 0
    // num_inst_vintrp                   : 0
    // num_inst_smem                     : 0
    // constant_literal_operands         : 0
    // num_tex                           : 4
    // num_vmem_group                    : 0
    // vmem_grouping_started             : 0
    // m_fFullPrecompilePromise          : 0
    // m_fIntegerDivideExpansion         : 0
    // m_fIntegerModExpansion            : 0
    // m_fDoubleDivideExpansion          : 0
    // m_fUsesScratch                    : 0
    // m_fPerThreadIndirection           : 0
    // m_fUsingTableLoads                : 0
    // m_fUsingSHmemLoads                : 0
    // fSemanticHashFlagOverrideApplied  : 0
    // fPSHasNoUAVWrite                  : 0
    // version                           : 2
    // fCodePatched                      : 0
    
    // Approximately 3 instruction slots used
    #endif
    
    const BYTE g_vs_main[] =
    {
         68,  88,  66,  67,  69,  20, 
        129, 136, 215,  73,  53,  15, 
        169,  15, 129, 169, 105, 218, 
        127,  10,   1,   0,   0,   0, 
        212, 118,   0,   0,   7,   0, 
          0,   0,  60,   0,   0,   0, 
        176,   0,   0,   0,   0,   1, 
        。。。 
        。。。
    }    
    VertexShader.h
    #if 0
    //
    // Generated by Microsoft (R) HLSL Shader Compiler For Durango
    //
    //
    //
    // Input signature:
    //
    // Name                 Index   Mask Register SysValue  Format   Used
    // -------------------- ----- ------ -------- -------- ------- ------
    // SV_POSITION              0   xyzw        0      POS   float       
    // COLOR                    0   xyzw        1     NONE   float   xyzw
    //
    //
    // Output signature:
    //
    // Name                 Index   Mask Register SysValue  Format   Used
    // -------------------- ----- ------ -------- -------- ------- ------
    // SV_TARGET                0   xyzw        0   TARGET   float   xyzw
    //
    ps_5_0
    // Opaque Custom Data - XBOX Precompiled Shader Header
    // First Precompiled Shader at offset:[27]
    // Embedded Data:
    //  0x0000001b - Offset To First Precompiled Shader
    //  0x00000050 - Original Shader Descriptor
    //  0x00000016 - Original Shader Size
    dcl_globalFlags refactoringAllowed | skipOptimization
    dcl_input_ps linear v1.xyzw
    dcl_output o0.xyzw
    dcl_temps 1
    //
    // Initial variable locations:
    //   v0.x <- In.position.x; v0.y <- In.position.y; v0.z <- In.position.z; v0.w <- In.position.w; 
    //   v1.x <- In.color.x; v1.y <- In.color.y; v1.z <- In.color.z; v1.w <- In.color.w; 
    //   o0.x <- <main return value>.color.x; o0.y <- <main return value>.color.y; o0.z <- <main return value>.color.z; o0.w <- <main return value>.color.w
    //
    #line 21 "C:UserswangsongweiDesktopDurangoGameDurangoGamePixelShader1.hlsl"
    mov r0.xyzw, v1.xyzw  // r0.x <- Out.color.x; r0.y <- Out.color.y; r0.z <- Out.color.z; r0.w <- Out.color.w
    mov o0.xyzw, r0.xyzw
    ret 
    // Opaque Custom Data - XBOX Precompiled Shader Object
    // Offset:[27], bundle is:[130] DWORDS.
    // Disassembled Precompiled Shader Object:
    // Shader Type               : (PS)
    // Shader Hw Stage           : (PS)
    // HLSL Source Filename      : C:UserswangsongweiDesktopDurangoGameDurangoGamePixelShader1.hlsl
    // HLSL Entrypoint Name      : main
    // __XBOX_SHADER_UNIQUE_HASH : 0x8ff4423e
    // Shader Semantic Hash      : 0xb9c70b8dba049c28
    //
    // Shader Data:
    // ----------------- PS Data ------------------------
    ; Input Semantic Mappings
    ;   [0] generic, usageIdx  1, channelMask 15, param0, paramSlot 1, DefaultVal={0,0,0,0}
    
    codeLenInByte        = 56 bytes;
    
    ; launchModeFlags    = 0x0000000E
    srdTableSupport      = TRUE
    immediateSupportExt  = TRUE
    srdTableSupportExt   = TRUE
    
    userElementCount     = 0;
    extUserElementCount  = 0;
    NumVgprs             = 5;
    NumSgprs             = 4;
    FloatMode            = 192;
    IeeeMode             = 0;
    FlatPtr32            = 0;
    ScratchSize          = 0 dwords/thread;
    LDSByteSize          = 0 bytes/workgroup (compile time only);
    ScratchWaveOffsetReg = s65535;
    ; texSamplerUsage         = 0x00000000
    ; constBufUsage           = 0x00000000
    
    ; SPI_SHADER_PGM_RSRC2_PS = 0x00000004
    SSPRP:SCRATCH_EN            = 0
    SSPRP:USER_SGPR             = 2
    SSPRP:TRAP_PRESENT          = 0
    SSPRP:WAVE_CNT_EN           = 0
    SSPRP:EXTRA_LDS_SIZE        = 0
    SSPRP:EXCP_EN               = 0
    ; SPI_SHADER_Z_FORMAT     = 0x00000000
    SPZF:Z_EXPORT_FORMAT        = 0; SPI_SHADER_ZERO
    ; SPI_PS_IN_CONTROL       = 0x00000001
    SPIC:NUM_INTERP             = 1
    SPIC:PARAM_GEN              = 0
    SPIC:FOG_ADDR               = 0
    SPIC:BC_OPTIMIZE_DISABLE    = 0
    SPIC:PASS_FOG_THROUGH_PS    = 0
    ; SPI_PS_INPUT_ADDR       = 0x00000002
    SPIA:PERSP_CENTER_ENA       = 1
    ; DB_SHADER_CONTROL       = 0x00000010
    DB:Z_ORDER                  = 1
    DB:CONSERVATIVE_Z_EXPORT    = 0; EXPORT_ANY_Z
    ; CB_SHADER_MASK          = 0x0000000F
    CB:OUTPUT0_ENABLE           = 15
    
    // Shader Instructions:
    shader main
      asic(CI)
      type(PS)
                                                                // s_ps_state in s0
      s_mov_b32     m0, s2                                  // 000000000000: BEFC0302
      v_interp_p1_f32  v2, v0, attr0.x                      // 000000000004: C8080000
      v_interp_p1_f32  v3, v0, attr0.y                      // 000000000008: C80C0100
      v_interp_p1_f32  v4, v0, attr0.z                      // 00000000000C: C8100200
      v_interp_p1_f32  v0, v0, attr0.w                      // 000000000010: C8000300
      v_interp_p2_f32  v2, v1, attr0.x                      // 000000000014: C8090001
      v_interp_p2_f32  v3, v1, attr0.y                      // 000000000018: C80D0101
      v_interp_p2_f32  v4, v1, attr0.z                      // 00000000001C: C8110201
      v_interp_p2_f32  v0, v1, attr0.w                      // 000000000020: C8010301
      v_cvt_pkrtz_f16_f32  v1, v2, v3                       // 000000000024: 5E020702
      v_cvt_pkrtz_f16_f32  v0, v4, v0                       // 000000000028: 5E000104
      exp           mrt0, v1, v1, v0, v0 done compr vm      // 00000000002C: F8001C0F 00000001
      s_endpgm                                              // 000000000034: BF810000
    end
    
    
    // Shader Statistics:
    //  NumActiveWaveFront:         40
    //  WorkgroupSize:              64
    //  NumVRegs:                   5
    //  NumSRegs:                   3
    //  NumActiveWaveFrontByVReg:   40
    //  NumActiveWaveFrontBySReg:   40
    //  NumActiveWaveFrontByLDS:    40
    //  CycleSim:                   82
    //  CycleSimNWaves:             82
    //  Code Size:                  56
    //Assembler Counts:
    //  num_32bit_ops                     : 12
    //  num_64bit_ops                     : 1
    //  num_alu                           : 10
    //  num_fc                            : 2
    //  num_inst_exp                      : 1
    //  num_inst_ldsgds                   : 0
    //  num_inst_mimg                     : 0
    //  num_inst_mtbuf                    : 0
    //  num_inst_mubuf                    : 0
    //  num_inst_sopp                     : 1
    //  num_inst_sopc                     : 0
    //  num_inst_sop1                     : 1
    //  num_inst_sop2                     : 0
    //  num_inst_smrd                     : 0
    //  num_inst_sopk                     : 0
    //  num_inst_vop1                     : 0
    //  num_inst_vop2                     : 2
    //  num_inst_vop3                     : 0
    //  num_inst_vopc                     : 0
    //  num_inst_vintrp                   : 8
    //  constant_literal_operands         : 0
    //  num_tex                           : 1
    //  num_vmem_group                    : 0
    //  vmem_grouping_started             : 0
    //
    //Compilation Notes:
    //
    //  PS has no UAV writes, consider forcing REZ/LATEZ.
    // Shader Statistics:
    // m_uNumActiveWaveFront             : 40
    // m_uVRegLimit                      : 256
    // m_uSRegLimit                      : 512
    // m_uNumVRegs                       : 5
    // m_uNumSRegs                       : 3
    // m_uSCCodeSize                     : 56
    // m_uWorkgroupSize                  : 64
    // m_uNumActiveWaveFrontByVReg       : 40
    // m_uNumActiveWaveFrontBySReg       : 40
    // m_uNumActiveWaveFrontByLDS        : 40
    // m_uCycleSim1Wave                  : 82
    // m_uCycleSimNWaves                 : 82
    
    // Assembler Counts:
    // num_32bit_ops                     : 12
    // num_64bit_ops                     : 1
    // num_alu                           : 10
    // num_fc                            : 2
    // num_inst_exp                      : 1
    // num_inst_ldsgds                   : 0
    // num_inst_mimg                     : 0
    // num_inst_mtbuf                    : 0
    // num_inst_mubuf                    : 0
    // num_inst_sopp                     : 1
    // num_inst_sopc                     : 0
    // num_inst_sop1                     : 1
    // num_inst_sop2                     : 0
    // num_inst_smrd                     : 0
    // num_inst_sopk                     : 0
    // num_inst_vop1                     : 0
    // num_inst_vop2                     : 2
    // num_inst_vop3                     : 0
    // num_inst_vopc                     : 0
    // num_inst_vintrp                   : 8
    // num_inst_smem                     : 0
    // constant_literal_operands         : 0
    // num_tex                           : 1
    // num_vmem_group                    : 0
    // vmem_grouping_started             : 0
    // m_fFullPrecompilePromise          : 0
    // m_fIntegerDivideExpansion         : 0
    // m_fIntegerModExpansion            : 0
    // m_fDoubleDivideExpansion          : 0
    // m_fUsesScratch                    : 0
    // m_fPerThreadIndirection           : 0
    // m_fUsingTableLoads                : 0
    // m_fUsingSHmemLoads                : 0
    // fSemanticHashFlagOverrideApplied  : 0
    // fPSHasNoUAVWrite                  : 1
    // version                           : 2
    // fCodePatched                      : 0
    
    // Approximately 3 instruction slots used
    #endif
    
    const BYTE g_ps_main[] =
    {
         68,  88,  66,  67,  62, 154, 
          8, 223,  12, 158, 224, 177, 
         58,  26,  76,  41, 172, 172, 
         35,  60,   1,   0,   0,   0, 
        112,  82,   0,   0,   7,   0, 
          0,   0,  60,   0,   0,   0, 
        176,   0,   0,   0,   4,   1, 
          0,   0,  56,   1,   0,   0, 
        188,   3,   0,   0,  88,   4, 
          0,   0,  96,  82,   0,   0, 
        ... ...
    }
    PixelShader.h
    
    

    Adding declarations for the triangle

    Next, add declarations to the header file to draw a triangle.

    To add declarations to the header file to draw a triangle

    1. Open Game.h in the source editor.
    2. Add the following declarations to the private section of the Game class.

        // Declarations for drawing a triangle
        struct s_Vertex
        {
          float vPostion[4];
          float vColor[4];
        };
      
        Microsoft::WRL::ComPtr<ID3D11InputLayout>         m_InputLayout;
        Microsoft::WRL::ComPtr<ID3D11Buffer>              m_VertexBuffer;
        Microsoft::WRL::ComPtr<ID3D11VertexShader>        m_VertexShader;
        Microsoft::WRL::ComPtr<ID3D11PixelShader>         m_PixelShader;
      

    Shown here for reference, the following code lists the whole class declaration.

      ref class Game sealed
      {
      public:
    
      Game();
    
      // Initialization and management
      void Initialize(Windows::UI::Core::CoreWindow^ window);
    
      // Basic game loop
      void Tick();
      void Update(float totalTime, float elapsedTime);
      void Render();
    
      // Rendering helpers
      void Clear();
      void Present();
    
      private:
    
      void CreateDevice();
      void CreateResources();
    
      // Core Application state
      Platform::Agile<Windows::UI::Core::CoreWindow>   m_window;
      Windows::Foundation::Rect                              m_windowBounds;
    
      // Direct3D Objects
      D3D_FEATURE_LEVEL                               m_featureLevel;
      Microsoft::WRL::ComPtr<ID3D11Device1>     m_d3dDevice;
      Microsoft::WRL::ComPtr<ID3D11DeviceContext1>  m_d3dContext;
    
      // Rendering resources
      Microsoft::WRL::ComPtr<IDXGISwapChain1>        m_swapChain;
      Microsoft::WRL::ComPtr<ID3D11RenderTargetView> m_renderTargetView;
      Microsoft::WRL::ComPtr<ID3D11DepthStencilView> m_depthStencilView;
      Microsoft::WRL::ComPtr<ID3D11Texture2D>        m_depthStencil;
    
      // Game state
      INT64                                           m_frame;
      BasicTimer^                                     m_timer;
    
      // Declarations for drawing a triangle
      struct s_Vertex
      {
        float vPostion[4];
        float vColor[4];
      };
    
      Microsoft::WRL::ComPtr<ID3D11InputLayout>  m_InputLayout;
      Microsoft::WRL::ComPtr<ID3D11Buffer>       m_VertexBuffer;
      Microsoft::WRL::ComPtr<ID3D11VertexShader> m_VertexShader;
      Microsoft::WRL::ComPtr<ID3D11PixelShader>  m_PixelShader;
      };
    

    Initializing triangle data

    Next, initialize triangle data by adding source code to Game.cpp.

    To add triangle data to Game.cpp

    1. Open Game.cpp.
    2. Locate the definition for the function CreateResources.
    3. Add the following code at the end of CreateResources():

        // The compiled shader bytecodes are contained in constant buffers,
        // g_vs_main and g_ps_main defined in the auto-generated header files.
        DX::ThrowIfFailed( m_d3dDevice->CreateVertexShader( g_vs_main,
          sizeof( g_vs_main ),
          NULL,
          m_VertexShader.GetAddressOf() )
        );
      
        DX::ThrowIfFailed( m_d3dDevice->CreatePixelShader( g_ps_main,
          sizeof( g_ps_main ),
          NULL,
          m_PixelShader.GetAddressOf() )
        );
      
        // Create input layout (must match declaration of s_Vertex)
        const D3D11_INPUT_ELEMENT_DESC InputElementDesc[] =
        {
          {
            "POSITION",                     // LPCSTR SemanticName;
            0,                              // UINT SemanticIndex;
            DXGI_FORMAT_R32G32B32A32_FLOAT, // DXGI_FORMAT Format;
            0,                              // UINT InputSlot;
            0,                              // UINT AlignedByteOffset;
            D3D11_INPUT_PER_VERTEX_DATA,    // InputSlotClass;
            0,                              // UINT InstanceDataStepRate;
          },
          {
            "COLOR",                        // LPCSTR SemanticName;
            0,                              // UINT SemanticIndex;
            DXGI_FORMAT_R32G32B32A32_FLOAT, // DXGI_FORMAT Format;
            0,                              // UINT InputSlot;
            D3D11_APPEND_ALIGNED_ELEMENT,   // UINT AlignedByteOffset;
            D3D11_INPUT_PER_VERTEX_DATA,    // InputSlotClass;
            0,                              // UINT InstanceDataStepRate;
          },
        };
      
        DX::ThrowIfFailed( m_d3dDevice->CreateInputLayout( InputElementDesc,
          _countof( InputElementDesc ),
          g_vs_main,
          sizeof( g_vs_main ),
          m_InputLayout.GetAddressOf() )
        );
      
        // Create vertex buffer containing a single triangle
        s_Vertex VertexData[3] =
        {
          {
            {  0.0f,  0.5f,  0.5f,  1.0f },
            {  1.0f,  0.0f,  0.0f,  1.0f },
          },
          {
            {  0.5f, -0.5f,  0.5f,  1.0f },
            {  0.0f,  1.0f,  0.0f,  1.0f },
          },
          {
            { -0.5f, -0.5f,  0.5f,  1.0f },
            {  0.0f,  0.0f,  1.0f,  1.0f },
          },
        };
      
        D3D11_SUBRESOURCE_DATA InitialData = {
          VertexData,                     // const void *pSysMem;
          0,                              // UINT SysMemPitch;
          0,                              // UINT SysMemSlicePitch;
        };
        D3D11_BUFFER_DESC BufferDesc = {
          sizeof( VertexData ),           // UINT ByteWidth;
          D3D11_USAGE_IMMUTABLE,          // D3D11_USAGE Usage;
          D3D11_BIND_VERTEX_BUFFER,       // UINT BindFlags;
          0,                              // UINT CPUAccessFlags;
          0,                              // UINT MiscFlags;
          sizeof( VertexData[0] ),        // UINT StructureByteStride;
        };
        DX::ThrowIfFailed( m_d3dDevice->CreateBuffer( &BufferDesc, &InitialData, m_VertexBuffer.GetAddressOf() ) );
      

    Rendering the triangle

    Next, add source code to Game.cpp that will render the triangle.

    To add source code to render the triangle

    1. Locate the definition of the method Game::Render, in Game.cpp.

      Look for the following comment: // TODO: Add your rendering code here

    2. Replace the comment with the following code:

        // Set input assembler state
        m_d3dContext->IASetInputLayout( m_InputLayout.Get() );
        UINT Strides[1] = { sizeof( s_Vertex ), };
        UINT Offsets[1] = { 0, };
        m_d3dContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
        m_d3dContext->IASetVertexBuffers( 0, 1, m_VertexBuffer.GetAddressOf(), Strides, Offsets );
      
        // Set shaders
        m_d3dContext->VSSetShader( m_VertexShader.Get(), NULL, 0 );
        //m_d3dContext->GSSetShader( NULL, NULL, 0 );
        m_d3dContext->PSSetShader( m_PixelShader.Get(), NULL, 0 );
      
        // Draw triangle
        m_d3dContext->Draw( 3, 0 );
      

    Building and deploying

    If you've completed the preceding steps in this tutorial, you can now build and deploy your first app to the dev kit.

    To build and deploy your app

    1. Use Connect (xbconnect.exe) to set the default remote console, or set the IP address of the console in the project properties.

    2. On the Build menu, click Build Solution.

      Wait for building to finish.

    3. On the Build menu, click Deploy Solution.

    4. Navigate to the All Apps page on the dev kit using the Xbox controller, and select DurangoGame.

      Note that it can take some time for the app to both deploy and run.

    5.  如果利用XDK自带的manager工具进行deplay到kit上,deplay以下路径即可(这里的.cso文件是在VS里面shader文件右键属性中的“ObjectFileName”一栏保留默认设置“$(OutDir)%(Filename).cso”以生成的shader的编译结果文件):

    See also

  • 相关阅读:
    初始rt1052GPIO之输入输出操作
    i.MX RT驱动LCD详解
    GPIO输入—按键查询检测
    RT1052之IOMUXC
    常见和弦整理
    和声进行的基本框架
    为什么很多人会有“年龄焦虑”?
    vuex store 分模块化
    clickhouse集群部署方法和验证方法
    【TPCH】总结介绍
  • 原文地址:https://www.cnblogs.com/DeanWang/p/6428419.html
Copyright © 2020-2023  润新知