[0312 조진현] good bye dx9

1,792 views
1,583 views

Published on

Published in: Education
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,792
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
20
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

[0312 조진현] good bye dx9

  1. 1. DevRookie<br />조 진현( GOGN )<br />
  2. 2. 영원할 것 같았던~~<br />DX9 와의 시간은…<br />
  3. 3. 이제 끝났습니다…<br />
  4. 4. Good bye~~ DX9!<br />이제 너랑 안놀아~~<br />
  5. 5. 어려운 걸로 준비했습니다!<br />오늘의 내용<br />DevRookie 199회 특집이라서…<br />
  6. 6. 주의 사항!!!<br />
  7. 7. 시간<br />
  8. 8.
  9. 9.
  10. 10.
  11. 11.
  12. 12. 시대<br />
  13. 13.
  14. 14.
  15. 15. 패러다임의 변화<br />
  16. 16. DirectX…<br />
  17. 17. DirectX 의 변화를 요구하다…<br />멀티 코어<br />GPU 발전<br />
  18. 18. DirectX 10<br />그래서 등장했습니다!!!<br />
  19. 19. DirectX11 API는…<br /> DirectX 10.1 기반입니다!!<br />
  20. 20. DirectX11 의 특징들<br />Dynamic Shader Linkage<br /><ul><li>Class Linkage on DirectX 11 HW
  21. 21. interface construct works on older profiles</li></ul>Hardware Tessellation<br /><ul><li>DirectX 11 HW only</li></ul>HLSL Shader Model 5<br /><ul><li>5.0 on DirectX 11 HW
  22. 22. Some new constructs emulated on older profiles</li></ul>Multithreaded Rendering & Resource Creation<br /><ul><li>Runtime emulation or Driver optimized</li></ul>DirectCompute<br /><ul><li>CS 5.0 on DirectX 11 HW
  23. 23. CS 4.x on some DX10.x h/w</li></ul>BC6H/BC7 Texture Formats<br /><ul><li>DirectX 11 HW only</li></li></ul><li>이제는 에픽도 한다.<br />
  24. 24. 변화의 흔적들<br />
  25. 25. http://blog.naver.com/asesin/130072247615<br />
  26. 26.
  27. 27. DirectX9<br />싱글 코어 기반의 API<br />API 중심의 파이프라인 처리<br />
  28. 28. DirectX10<br />멀티 코어 기반의 API<br />하드웨어 중심의 파이 파이프라인 처리<br />
  29. 29. 더 이상 게임 목적이 아니다!!!<br />굴러온 돌<br />Win32 Application<br />Win32 Application<br />Win32 Application<br />Future<br />Graphics<br />Components<br />Direct3D API<br />GDI<br />Direct3D API<br />User-Mode Driver<br />HAL Device<br />DXGI<br />Device Driver Interface ( DDI )<br />Kernel-mode Driver. <br />Hardware<br />Graphics Hardware<br />
  30. 30.
  31. 31. 하드웨어가 변하기 시작!!!<br />
  32. 32. 우리가 하는 일은…<br />API 를 통한 하드웨어 제어<br />
  33. 33. 하드웨어는 이미 변했다!<br />Rasterizer<br />Rasterizer<br />Tessellator<br />
  34. 34. 시대는 점점…<br />Multi-Thread<br />Multi-Core<br />Multi-GPU<br />
  35. 35. DirectX 의 최신 트렌드는?<br />멀티 코어 활용<br />GPU 활용<br />
  36. 36. DX API 변화<br />
  37. 37. DX11 은 이를 더욱 향상!!<br />DirectX10 API 디자인 목표<br /><ul><li> Asynchronous Resource resources loading & modification.</li></ul>☞ Device와 driver 간의 오버헤드 감소.<br /><ul><li> Multithreaded draw.</li></ul>☞ 렌더링 작업의 여러 스레드들로 분산.<br /><ul><li> Display lists.</li></ul>☞ 한번 기록한 커맨들의 재사용으로 인한 성능 향상.<br />
  38. 38. CPU 처리 최적화!<br />CPU 성능 개선 이슈<br />Debug Layer<br />Draw Call Management<br />Constant Updates<br />Resource Updates<br />State Management<br />Shader Linkage<br />Asynchronous Queries<br />…<br />
  39. 39. 멀티 스레딩 지원 강화<br />Direct3D API 측면에서의 변화<br />ID3D11Device<br />ID3D10Device<br />ID3D11DeviceContext<br />
  40. 40. thread-safe<br />Core Interface 분류<br />
  41. 41. ID3D11Asynchronous<br />
  42. 42. ID3D11Resource<br />
  43. 43. ID3D11View<br />
  44. 44. 이 모든 게 멀티스레딩을 위함!<br />ID3D11DeviceChild 상속<br />ID3D11ClassInstance <br />ID3D11ClassLinkage<br />ID3D11CommandList<br />ID3D11RasterizerState<br />ID3D11SamplerState<br />ID3D11DepthStencilState<br />ID3D11InputLayout<br />ID3D11BlendState<br /><ul><li>ID3D11ComputeShader
  45. 45. ID3D11DomainShader
  46. 46. ID3D11GeometryShader
  47. 47. ID3D11HullShader
  48. 48. ID3D11PixelShader
  49. 49. ID3D11VertexShader
  50. 50. …</li></li></ul><li>DX9의 작업 구조<br /><ul><li> IDirect3D9 오브젝트를 획득.
  51. 51. 사용가능한Device를 검색
  52. 52. IDirect3DDevice9 를 생성
  53. 53. Caps를 조회
  54. 54. 리소스들을 생성( POOL )</li></li></ul><li>DX10의 작업 구조<br /><ul><li>IDXGIFactory의 생성
  55. 55. ID3DXGOPOutput 탐색
  56. 56. ID3D10Device 생성( 스왑체인 생성 )
  57. 57. 리소스 생성</li></ul>내 블로그에 관련 글 있다!<br />
  58. 58. DX10부터는…<br />Caps 소멸<br />Device-Lost 걱정 無<br />
  59. 59. 그렇다면, 리소스 관리 전략은<br />어떻게 구상해야 하나요?<br />
  60. 60. 리소스 관리 전략<br />리소스의 업데이트<br />CPU에서의 접근 권한<br />
  61. 61. 리소스 메모리 플래그<br />
  62. 62. XNA Math<br />
  63. 63. D3DX 9 Lib<br />Xbox Math Lib<br />D3DX 10 Lib<br />
  64. 64. XNA Math Lib<br />
  65. 65. XMVerifyCPUSupport()<br />SSE/SSE2<br />VMX128<br />
  66. 66. XNA Math 를 써야하는 이유<br />더 많은 inline<br />더 좋은 SIMD최적화<br />D3DXMath는 끝!<br />
  67. 67. 주의!<br />혼합해서 사용하지 말 것!<br />
  68. 68. Tessellation<br />
  69. 69.
  70. 70.
  71. 71.
  72. 72. Adaptive vs Uniform<br />
  73. 73. Texture 시대<br />Pixel 시대<br />Vertex 시대<br />
  74. 74. 텍스쳐의 힘?<br />
  75. 75. Regularly drawn Froblin<br />No tessellation used<br />
  76. 76. FroblinClose-up:No tessellation<br />
  77. 77. 폴리곤을 늘리자!!!<br />어떻게 하면 더욱 정밀한 표현을 <br />할 수 있나요?<br />
  78. 78. High Detail Froblinwith Tessellation and Displacement Mapping<br />
  79. 79. Froblin With Tessellation and Displacement Mapping Close-up<br />
  80. 80. 많은 폴리곤은 범죄!!!<br />왜 게임에서는 폴리곤갯수를<br /> 증가시키기 어려운가요?<br />
  81. 81. 또 다른 문제…<br />
  82. 82. 근본적으로 본 개수가 많음!!!<br />스키닝 연산의 최적화<br />각종 수치 데이터를 최대한 활용. <br />데이터 양을 줄이는 방법.<br /> DX10의 경우에는 StreamOut기능 활용.<br />
  83. 83. H/W 테셀레이션 님이 등장!<br />문제들…<br />그래픽 퀄리티의 향상 텍스쳐링의 한계<br />멀티패스 렌더링의 보편화 스키닝 부담<br />
  84. 84. DX11 에서 채택!<br />ATI의 노력<br /> RADEON 8500 시리즈에서 시작.<br /> X-Box 360 에서 도입.<br /> ATI 제품군에 전면 도입. <br />
  85. 85. 패치란…<br /><ul><li> 새로 생성되는 기하.
  86. 86. 제어점들에 의해 정의.
  87. 87. 삼각형들은 패치들에 의해서 증가.
  88. 88. 패치 단위로 LOD 가 연산.</li></li></ul><li>왜 LOD가 필요한가?<br /><ul><li>테셀레이션은 본질적으로 동적 LOD를 지원.
  89. 89. 카메라 기반 or 패치의 크기.
  90. 90. 효과적인 렌더링 방법.</li></li></ul><li>Egde마다 TF를 계산한다.<br />
  91. 91. 문제 발생의 경우<br />
  92. 92.
  93. 93.
  94. 94. DX9 vs DX11 Tessellation Pipeline<br />Input Assembler<br />Vertex Shader<br />Input Assembler<br />HullShader<br />Tessellator<br />Tessellator<br />Vertex Shader<br />Domain Shader<br />Memory / Resources<br />Geometry Shader<br />Stream Output<br />Rasterizer<br />Rasterizer<br />Pixel Shader<br />Pixel Shader<br />Output Merger<br />Output Merger<br />
  95. 95. 이미 존재했던 개념!<br />DX9 Tessellation API<br /><ul><li>IDirect3DDevice9::DrawTriPatch
  96. 96. IDirect3DDevice9::SetNPatchMode
  97. 97. ID3DXPMesh
  98. 98. Etc…</li></li></ul><li>Tessellation 을 위한 정보<br />Control Points<br />Tessellation Factors<br />
  99. 99. DX9 Adaptive Tessellation<br />
  100. 100. DX9의 테셀레이션 문제점<br /><ul><li>3 PASS Rendering
  101. 101. 별도의 메모리가 필요.</li></li></ul><li>DX11 Adaptive Tessellation<br />Input Assembler<br />Vertex Shader<br /><ul><li>스키닝, 모핑, 변환 등의 연산 수행.
  102. 102. LOD 판정.</li></ul>HullShader<br />Tessellator<br />Domain Shader<br />Geometry Shader<br />Rasterizer<br />Pixel Shader<br />Output Merger<br />
  103. 103. Parallel~~~<br />DX11 Adaptive Tessellation<br />Input Assembler<br />Vertex Shader<br />HullShader<br />Tessellator<br />Control Points( ID 식별 )<br />Hull Shader<br />Domain Shader<br />Geometry Shader<br />patch control points from the VS.<br />Rasterizer<br />Patch Constant Data<br />( Tessellation Factors 포함 )<br />Pixel Shader<br />Output Merger<br />
  104. 104. DX11 Adaptive Tessellation<br />Input Assembler<br />Vertex Shader<br />HullShader<br />BaryCentric Coordinate<br />생성<br />Tessellator<br />Domain Shader<br />Geometry Shader<br />Stream Output<br />Rasterizer<br />Pixel Shader<br />Output Merger<br />
  105. 105. 무게 중심 좌표(BaryCentric Coordinate )<br />C weight = Area of APB / Area of ABC<br />
  106. 106. [domain("tri")]<br />DS_OUTPUT DS( HS_CONSTANT_DATA_OUTPUT input, float3 BarycentricCoordinates : SV_DomainLocation,<br />const OutputPatch<HS_CONTROL_POINT_OUTPUT, 3> TrianglePatch )<br />{<br /> DS_OUTPUT output = (DS_OUTPUT)0;<br /> // Interpolate world space position with barycentric coordinates<br /> float3 vWorldPos = BarycentricCoordinates.x * TrianglePatch[0].vWorldPos +BarycentricCoordinates.y * TrianglePatch[1].vWorldPos + BarycentricCoordinates.z * TrianglePatch[2].vWorldPos;<br />
  107. 107. Surface evaluation<br />Displacement mapping<br />DX11 Adaptive Tessellation<br />Input Assembler<br />Vertex Shader<br />HullShader<br />Tessellator<br />Hull Shader<br />Output Control Points<br />Domain Shader<br />Domain Shader<br />Vertex Position<br />Geometry Shader<br />Stream Output<br />Rasterizer<br />Tessellator Stage <br />Output Texture Coordinates<br />Pixel Shader<br />Output Merger<br />
  108. 108. H/W Tessellation 의 이점은 ?<br />GPU 의 프로세싱 능력 활용! ( 1PASS )<br />메모리 절약!<br />대역폭 감소!<br />렌더링퀄리티 향상<br />성능의 향상<br />
  109. 109. DX11을 활용할 만큼 GPU가 빠른가요?<br />
  110. 110. Rasterizer<br />Geometry Unit( with Tessellator )<br />
  111. 111. NT = 411 × NL<br />
  112. 112. 의심하지 말라~~<br />테셀레이션은 성능 향상이 목적!!!<br />
  113. 113. 옛날 그래픽 카드들에서 DX11 실행이 가능한가요?<br />
  114. 114.
  115. 115.
  116. 116. DX9  DX11 로 업그레이드 하고 싶어요! 오래 걸리나요?<br />
  117. 117. 어렵다!!!<br />DX9  DX11<br />DX9  DX10 으로 포팅하라!  모든 파이프라인 사용 방법 수정  스테이트 오브젝트 사용할 것.  InputLayout으로 쉐이더 연결할 것.  상수 버퍼 사용할 것.  etc..<br />
  118. 118. 테셀레이션은렌더링 목적!<br />테셀레이션 처리된 메시의 경우 충돌체크를 어찌해야 하나요?<br />
  119. 119. 테셀레이션 처리된 메시의인스턴싱 처리는어떻게 해야 하나요?<br />
  120. 120. 다시 소프트웨어 렌더링 시대로 회귀할 것이다!!<br />
  121. 121. cbuffercbPerFrame : register( b0 )<br />{<br /> matrix g_mViewProjection;<br /> float g_fTessellationFactor;<br />};<br />struct VS_CONTROL_POINT_INPUT<br />{<br /> float3 vPosition : POSITION;<br />};<br />struct VS_CONTROL_POINT_OUTPUT<br />{<br /> float3 vPosition : POSITION;<br />};<br />
  122. 122. VS_CONTROL_POINT_OUTPUT VS( VS_CONTROL_POINT_INPUT Input )<br />{<br /> VS_CONTROL_POINT_OUTPUT Output;<br />Output.vPosition = Input.vPosition;<br /> return Output;<br />}<br />
  123. 123. struct HS_CONSTANT_DATA_OUTPUT<br />{<br /> float Edges[3] : SV_TessFactor;<br /> float Inside : SV_InsideTessFactor;<br />};<br />struct HS_OUTPUT<br />{<br /> float3 vPosition : POSITION;<br />};<br />
  124. 124. HS_CONSTANT_DATA_OUTPUT ConstantHS( InputPatch<VS_CONTROL_POINT_OUTPUT, 3> ip,<br />uintPatchID : SV_PrimitiveID )<br />{ <br /> HS_CONSTANT_DATA_OUTPUT Output;<br />Output.Edges[0] = Output.Edges[1] <br /> = Output.Edges[2] <br /> = g_fTessellationFactor;<br />Output.Inside = g_fTessellationFactor;<br /> return Output;<br />}<br />
  125. 125. [domain("tri")]<br />[partitioning(HS_PARTITION)]<br />[outputtopology("triangle_cw")]<br />[outputcontrolpoints(3)]<br />[patchconstantfunc("ConstantHS")]<br />HS_OUTPUT HS( InputPatch<VS_CONTROL_POINT_OUTPUT, 3> p, <br />uinti : SV_OutputControlPointID,<br />uintPatchID : SV_PrimitiveID )<br />{<br /> HS_OUTPUT Output;<br />Output.vPosition = p[i].vPosition;<br /> return Output;<br />}<br />
  126. 126. struct DS_OUTPUT<br />{<br /> float4 vPosition : SV_POSITION;<br />};<br />[domain("tri")]<br />DS_OUTPUT DS( HS_CONSTANT_DATA_OUTPUT input, <br /> float3 UVW : SV_DomainLocation,<br /> const OutputPatch<HS_OUTPUT, 3> patched )<br />{<br /> DS_OUTPUT Output;<br />float3 finalPos = UVW.x * patched[0].vPosition + <br />UVW.y * patched [1].vPosition + <br />UVW.z * patched [2].vPosition;<br />Output.vPosition = mul( float4(finalPos,1), g_mViewProjection );<br /> return Output; <br />}<br />
  127. 127. Displacementmapping<br />
  128. 128.
  129. 129.
  130. 130.
  131. 131.
  132. 132. Multi-ThreadedRendering<br />
  133. 133. Deferred Cotext!!!<br />멀티 스레드 기반으로 <br />렌더링 작업을 할 수 있나요?<br />
  134. 134. 과거 세대의 렌더링<br />
  135. 135. DX11의 렌더링<br />
  136. 136. DX11의 렌더링<br />
  137. 137. Multi-Threaded Rendering <br />ID3D11Device<br />Immediate Context<br />ID3D11DeviceContext<br />Deferred Context<br />free<br />thread<br />Rendering Command<br />
  138. 138. DX11의 렌더링<br />Immediate Context<br />Deferred Context<br />
  139. 139. 이전 세대의 렌더링<br />
  140. 140. 이전 세대의 렌더링<br />
  141. 141. 이전 세대의 렌더링<br />
  142. 142. 이전 세대의 렌더링<br />
  143. 143. 이전 세대의 렌더링<br />
  144. 144. DX11의 렌더링<br />
  145. 145. DX11의 렌더링<br />
  146. 146. DX11의 렌더링<br />
  147. 147. DX11의 렌더링<br />
  148. 148. DX11의 렌더링<br />
  149. 149. DX11의 렌더링<br />
  150. 150. DX11의 렌더링<br />
  151. 151. DX11의 렌더링<br />
  152. 152. DX11의 렌더링<br />
  153. 153. ID3D11CommandList<br />intm_iRenderThreadCount;<br />HANDLE* m_pDefferredThreadHandleArray;<br />HANDLE* m_pBeginDeferredEventHandleArray;<br />HANDLE* m_pEndDeferredEventHandleArray;<br />ID3D11DeviceContext** m_ippDeferredContextArray;<br />ID3D11CommandList** m_ippCommandListArray<br />
  154. 154. CreateDeferredContext<br />ID3D11DeviceContext* ipResultPointer = 0x00;<br />for( inti = 0; i < m_iRenderThreadCount; ++i )<br />{<br />ipResultPointer = JinRenderUtil::CreateDeferredContext( this->m_ipGPU );<br />m_ippDeferredContextPointerArray[ i ] = ipResultPointer;<br />m_pDeferredThreadHandleArray[ i ] = (HANDLE)_beginthreadex<br /> ( NULL,0, DeferredProcForRenderPerScene, &i, <br /> CREATE_SUSPENDED, NULL );<br />ResumeThread( this->m_pDeferredThreadHandleArray[ i ] );<br />}<br />
  155. 155. FinishCommandList<br />for(;;)<br />{<br /> ::WaitForSingleObject( GetBeginDeferredEventHandle( iInstance ), INFINITE );<br />RenderSomething();<br /> hr = ipDeferredContextPtr->FinishCommandList( FALSE, &ipCommandListPtr );<br /> assert( hr == S_OK );<br /> ::SetEvent( Jin3D::GetInstance()->GetEndDeferredEventHandle( iInstance ) );<br />}<br />
  156. 156. ExecuteCommandList<br />for( inti = 0; I < m_iThreadCount; ++i; )<br />{<br />m_ipImmediateContext->ExecuteCommandList( m_ippCommandListArray[ I ], TRUE );<br />}<br />
  157. 157. MTR 이란…<br />스레드들을 생성 ( 코어 개수만큼 )<br />커맨드 생성( 각 스레드별)<br />렌더링( 메인 스레드)<br />커맨드 전송( To GPU )<br />
  158. 158.
  159. 159. DirectCompute<br />
  160. 160. GPGPU ?<br />DirectCompute ?<br />ComputeShader ?<br />
  161. 161. GPGPU<br />General-Purpose computing on Graphics Processing Unit<br />
  162. 162. DirectCompute<br />GPGPU 를 위한 MS의 플랫폼<br />
  163. 163. Applications<br />Media playback or processing, media UI, recognition, etc. Technical<br />Domain Libraries<br />Domain Languages<br />Accelerator, Brook+, Rapidmind, Ct<br />MKL, ACML, cuFFT, D3DX, etc.<br />Compute Languages<br />DirectCompute, CUDA, CAL, OpenCL, LRB Native, etc.<br />Processors<br />CPU, GPU, Larrabee<br />nVidia, Intel, AMD, S3, etc.<br />
  164. 164. ComputeShader<br />DirectCompute를 구현하기 위한 HLSL<br />
  165. 165. 공부할 게 늘었다!!!!<br />
  166. 166. CPU vs GPU<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />CPU 0<br />CPU 1<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />CPU 2<br />CPU 3<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />L2 Cache<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />L2 Cache<br />
  167. 167. CPU<br />4 Cores<br />4 float wide SIMD<br />3GHz<br />48-96GFlops<br />2x HyperThreaded<br />64kB $L1/core<br />20GB/s to Memory<br />$200<br />200W<br />CPU 0<br />CPU 1<br />CPU 2<br />CPU 3<br />L2 Cache<br />
  168. 168. GPU<br />32 Cores<br />32 Float wide<br />1GHz<br />1TeraFlop<br />32x “HyperThreaded”<br />64kB $L1/Core<br />150GB/s to Mem<br />$200, <br />200W<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />SIMD<br />L2 Cache<br />
  169. 169. CPU<br />50GFlops<br />GPU<br />1TFlop<br />1GB/s<br />10GB/s<br />100GB/s<br />CPU RAM<br />4-6 GB<br />GPU RAM<br />1 GB<br />
  170. 170. DirectCompute Usage<br />
  171. 171. Example HLSLcode <br />#define BLOCK_SIZE 256<br />StructuredBuffer gBuf1;<br />StructuredBuffer gBuf2;<br />RWStructuredBuffergBufOut;<br />[numthreads(BLOCK_SIZE,1,1)]<br />void VectorAdd( uint3 id: SV_DispatchThreadID )<br />{<br />gBufOut[id] = gBuf1[id] + gBuf2[id];<br />}<br />
  172. 172. Compile the HLSL code<br />hr = D3DX11CompileFromFile(<br /> “myCode.hlsl”, // path to .hlsl file<br /> NULL,<br /> NULL,<br /> “VectorAdd”, // entry point<br />pProfile,<br /> NULL, // Flags<br /> NULL,<br /> NULL,<br /> &pBlob, // compiled shader<br /> &pErrorBlob, // error log<br /> NULL ); <br />
  173. 173. Initialize DirectCompute<br />hr = D3D11CreateDevice<br />(<br /> NULL, // default gfx adapter<br /> D3D_DRIVER_TYPE_HARDWARE, // use hw<br /> NULL, // not swrasterizer<br />uCreationFlags, // Debug, Threaded, etc.<br /> NULL, // feature levels<br /> 0, // size of above<br /> D3D11_SDK_VERSION, // SDK version<br />ppDeviceOut, // D3D Device<br /> &FeatureLevelOut, // of actual device<br />ppContextOut ); // subunit of device<br />);<br />
  174. 174. CS 생성 및 설정<br />pD3D->CreateComputeShader( pBlob->GetBufferPointer(),<br />pBlob->GetBufferSize(),<br /> NULL,<br /> &pMyShader ); // hw fmt<br />pD3D->CSSetShader( pMyShader, NULL, 0 );<br />
  175. 175. Resources<br />Resource Object<br />My Data Buffer<br />Sampler Resource View<br />Compute Shader<br />Unordered Access View<br />
  176. 176. 입력을 위한 버퍼 설정<br />D3D11_BUFFER_DESC descBuf;<br />ZeroMemory( &descBuf, sizeof(descBuf) );<br />desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS;<br />desc.StructureByteStride = uElementSize;<br />desc.ByteWidth = uElementSize * uCount;<br />desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;<br />pD3D->CreateBuffer( &desc, pInput, ppBuffer );<br />
  177. 177. 뷰 설정<br />D3D11_UNORDERED_ACCESS_VIEW_DESC desc;<br />ZeroMemory( &desc, sizeof(desc) );<br />desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER;<br />desc.Buffer.FirstElement = 0;<br />desc.Format = DXGI_FORMAT_UNKNOWN;<br />desc.Buffer.NumElements = uCount;<br />pD3D->CreateUnorderedAccessView(<br />pBuffer, // Buffer view is into<br /> &desc, // above data<br /> &pMyUAV ); // result<br />
  178. 178. 실행<br />pD3D->CSSetUnorderedAccessViews(<br /> 0,<br /> 1,<br /> &pMyUAV,<br /> NULL );<br />pD3D->Dispatch( GrpsX, GrpsY, GrpsZ );<br />
  179. 179. pDev11->Dispatch(3, 2, 1);<br />[numthreads(4, 4, 1)]<br />void MyCS(…)<br />10<br />00<br />00<br />01<br />02<br />03<br />00<br />01<br />02<br />03<br />20<br />00<br />01<br />02<br />03<br />10<br />11<br />12<br />13<br />10<br />11<br />12<br />13<br />10<br />11<br />12<br />13<br />20<br />21<br />22<br />23<br />20<br />21<br />22<br />23<br />20<br />21<br />22<br />23<br />30<br />31<br />32<br />33<br />30<br />31<br />32<br />33<br />30<br />31<br />32<br />33<br />01<br />11<br />21<br />00<br />01<br />02<br />03<br />00<br />01<br />02<br />03<br />00<br />01<br />02<br />03<br />10<br />11<br />12<br />13<br />10<br />11<br />12<br />13<br />10<br />11<br />12<br />13<br />20<br />21<br />22<br />23<br />20<br />21<br />22<br />23<br />20<br />21<br />22<br />23<br />30<br />31<br />32<br />33<br />30<br />31<br />32<br />33<br />30<br />31<br />32<br />33<br />
  180. 180. 결과를 얻기 위한 버퍼 설정<br />D3D11_BUFFER_DESC desc;<br />ZeroMemory( &desc, sizeof(desc) );<br />desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;<br />desc.Usage = D3D11_USAGE_STAGING;<br />desc.BindFlags = 0;<br />desc.MiscFlags = 0;<br />pD3D->CreateBuffer( &desc, NULL, &StagingBuf );<br />
  181. 181. 결과를 받아오기<br />pD3D->CopyResource( debugbuf, pBuffer );<br />
  182. 182.
  183. 183. The Teraflop Today<br />N-Body Demo App:<br />AMD Phenom II X4 940 3GHz + Radeon HD 5850<br />CPU      13.7GFlops Multicore SSE, not cache-aware<br />GPU   537GFlops DirectCompute<br />Intel Xeon E5410 2.33GHz + Radeon HD 5870<br />CPU 25.5GFlops Multicore SSE, not cache-aware <br />GPU   722GFlops DirectCompute<br />
  184. 184. 남자라면 DirectX11이죠!<br />DX11넘 멋져!!!<br />
  185. 185. Q&A<br />

×