Browse Source

39-assao: use buffer for atomic to support metal

attilaz 7 years ago
parent
commit
c23e2b6362
36 changed files with 11 additions and 11 deletions
  1. 5 5
      examples/39-assao/assao.cpp
  2. 2 2
      examples/39-assao/cs_assao_generate_q.sh
  3. 2 2
      examples/39-assao/cs_assao_load_counter_clear.sc
  4. 2 2
      examples/39-assao/cs_assao_postprocess_importance_map_b.sc
  5. BIN
      examples/runtime/shaders/dx11/cs_assao_generate_q3.bin
  6. BIN
      examples/runtime/shaders/dx11/cs_assao_load_counter_clear.bin
  7. BIN
      examples/runtime/shaders/dx11/cs_assao_postprocess_importance_map_b.bin
  8. BIN
      examples/runtime/shaders/dx11/cs_assao_prepare_depths_and_normals.bin
  9. BIN
      examples/runtime/shaders/dx11/cs_assao_prepare_depths_and_normals_half.bin
  10. BIN
      examples/runtime/shaders/glsl/cs_assao_generate_q0.bin
  11. BIN
      examples/runtime/shaders/glsl/cs_assao_generate_q1.bin
  12. BIN
      examples/runtime/shaders/glsl/cs_assao_generate_q2.bin
  13. BIN
      examples/runtime/shaders/glsl/cs_assao_generate_q3.bin
  14. BIN
      examples/runtime/shaders/glsl/cs_assao_generate_q3base.bin
  15. BIN
      examples/runtime/shaders/glsl/cs_assao_load_counter_clear.bin
  16. BIN
      examples/runtime/shaders/glsl/cs_assao_postprocess_importance_map_b.bin
  17. BIN
      examples/runtime/shaders/metal/cs_assao_apply.bin
  18. BIN
      examples/runtime/shaders/metal/cs_assao_generate_importance_map.bin
  19. BIN
      examples/runtime/shaders/metal/cs_assao_generate_q0.bin
  20. BIN
      examples/runtime/shaders/metal/cs_assao_generate_q1.bin
  21. BIN
      examples/runtime/shaders/metal/cs_assao_generate_q2.bin
  22. BIN
      examples/runtime/shaders/metal/cs_assao_generate_q3.bin
  23. BIN
      examples/runtime/shaders/metal/cs_assao_generate_q3base.bin
  24. BIN
      examples/runtime/shaders/metal/cs_assao_load_counter_clear.bin
  25. BIN
      examples/runtime/shaders/metal/cs_assao_non_smart_apply.bin
  26. BIN
      examples/runtime/shaders/metal/cs_assao_non_smart_blur.bin
  27. BIN
      examples/runtime/shaders/metal/cs_assao_non_smart_half_apply.bin
  28. BIN
      examples/runtime/shaders/metal/cs_assao_postprocess_importance_map_a.bin
  29. BIN
      examples/runtime/shaders/metal/cs_assao_postprocess_importance_map_b.bin
  30. BIN
      examples/runtime/shaders/metal/cs_assao_prepare_depth_mip.bin
  31. BIN
      examples/runtime/shaders/metal/cs_assao_prepare_depths.bin
  32. BIN
      examples/runtime/shaders/metal/cs_assao_prepare_depths_and_normals.bin
  33. BIN
      examples/runtime/shaders/metal/cs_assao_prepare_depths_and_normals_half.bin
  34. BIN
      examples/runtime/shaders/metal/cs_assao_prepare_depths_half.bin
  35. BIN
      examples/runtime/shaders/metal/cs_assao_smart_blur.bin
  36. BIN
      examples/runtime/shaders/metal/cs_assao_smart_blur_wide.bin

+ 5 - 5
examples/39-assao/assao.cpp

@@ -363,7 +363,7 @@ namespace
 			m_recreateFrameBuffers = false;
 			createFramebuffers();
 
-			m_loadCounter = bgfx::createTexture2D(1, 1, false, 1, bgfx::TextureFormat::R32U, BGFX_TEXTURE_COMPUTE_WRITE);
+			m_loadCounter = bgfx::createDynamicIndexBuffer(1, BGFX_BUFFER_COMPUTE_READ_WRITE | BGFX_BUFFER_INDEX32);
 
 			// Vertex decl
 			PosTexCoord0Vertex::init();
@@ -630,7 +630,7 @@ namespace
 
 							if (!adaptiveBasePass && (m_settings.m_qualityLevel == 3))
 							{
-								bgfx::setImage(3, m_loadCounter, 0, bgfx::Access::Read, bgfx::TextureFormat::R32U);
+								bgfx::setBuffer(3, m_loadCounter, bgfx::Access::Read);
 								bgfx::setTexture(4, s_importanceMap, m_importanceMap, SAMPLER_LINEAR_CLAMP);
 								bgfx::setImage(5, m_finalResults, 0, bgfx::Access::Read, bgfx::TextureFormat::RG8);
 							}
@@ -697,13 +697,13 @@ namespace
 						bgfx::setTexture(1, s_importanceMap, m_importanceMap);
 						bgfx::dispatch(view, m_postprocessImportanceMapAProgram, (m_quarterSize[0] + 7) / 8, (m_quarterSize[1] + 7) / 8);
 
-						bgfx::setImage(0, m_loadCounter, 0, bgfx::Access::ReadWrite, bgfx::TextureFormat::R32U);
+						bgfx::setBuffer(0, m_loadCounter, bgfx::Access::ReadWrite);
 						bgfx::dispatch(view, m_loadCounterClearProgram, 1,1);
 
 						m_uniforms.submit();
 						bgfx::setImage(0, m_importanceMap, 0, bgfx::Access::Write, bgfx::TextureFormat::R8);
 						bgfx::setTexture(1, s_importanceMap, m_importanceMapPong);
-						bgfx::setImage(2, m_loadCounter, 0, bgfx::Access::ReadWrite, bgfx::TextureFormat::R32U);
+						bgfx::setBuffer(2, m_loadCounter, bgfx::Access::ReadWrite);
 						bgfx::dispatch(view, m_postprocessImportanceMapBProgram, (m_quarterSize[0]+7) / 8, (m_quarterSize[1]+7) / 8);
 						++view;
 					}
@@ -1159,7 +1159,7 @@ namespace
 		// Only needed for quality level 3 (adaptive quality)
 		bgfx::TextureHandle m_importanceMap;
 		bgfx::TextureHandle m_importanceMapPong;
-		bgfx::TextureHandle m_loadCounter;
+		bgfx::DynamicIndexBufferHandle m_loadCounter;
 
 		struct Model
 		{

+ 2 - 2
examples/39-assao/cs_assao_generate_q.sh

@@ -59,7 +59,7 @@ CONST(uint g_numTaps[5]) = { 3, 5, 12, 0, 0 };
 SAMPLER2D(s_viewspaceDepthSource,  0); 
 SAMPLER2D(s_viewspaceDepthSourceMirror,  1); 
 IMAGE2D_RO(s_normalmapSource, rgba8, 2);
-UIMAGE2D_RO(s_loadCounter, r32ui, 3); 
+BUFFER_RO(s_loadCounter, uint, 3); 
 SAMPLER2D(s_importanceMap,  4); 
 IMAGE2D_ARRAY_RO(s_baseSSAO, rg8, 5);
 IMAGE2D_ARRAY_WR(s_target, rg8, 6);
@@ -410,7 +410,7 @@ void GenerateSSAOShadowsInternal( out float outShadowTerm, out vec4 outEdges, ou
         float edgeCount = dot( 1.0-edgesLRTB, vec4( 1.0, 1.0, 1.0, 1.0 ) );
         //importance += edgeCount / (float)SSAO_ADAPTIVE_TAP_FLEXIBLE_COUNT;
 
-        float avgTotalImportance = float(imageLoad(s_loadCounter,ivec2(0,0)).x) * u_loadCounterAvgDiv;
+        float avgTotalImportance = float(s_loadCounter[0]) * u_loadCounterAvgDiv;
 
         float importanceLimiter = saturate( u_adaptiveSampleCountLimit / avgTotalImportance );
         importance *= importanceLimiter;

+ 2 - 2
examples/39-assao/cs_assao_load_counter_clear.sc

@@ -6,10 +6,10 @@
 #include "bgfx_compute.sh" 
 #include "uniforms.sh"
 
-UIMAGE2D_WR(s_loadCounterOutputUAV, r32ui, 0);
+BUFFER_WR(s_loadCounter, uint, 0);
 
 NUM_THREADS(1, 1, 1)
 void main() 
 {
-	imageStore(s_loadCounterOutputUAV, ivec2(0, 0), uvec4(0,0,0,0));
+	s_loadCounter[0] = 0;
 }

+ 2 - 2
examples/39-assao/cs_assao_postprocess_importance_map_b.sc

@@ -8,7 +8,7 @@
 
 IMAGE2D_WR(s_target, r8, 0);
 SAMPLER2D(s_importanceMap, 1);
-UIMAGE2D_RW(s_loadCounterOutputUAV, r32ui, 2);
+BUFFER_RW(s_loadCounter, uint, 2);
 
 CONST(float cSmoothenImportance) = 1.0;
 
@@ -49,7 +49,7 @@ void main()
 #else
 		if( ((dtID.x % 3) + (dtID.y % 3)) == 0  )
 #endif
-			imageAtomicAdd(s_loadCounterOutputUAV, ivec2(0, 0), sum );
+			atomicAdd(s_loadCounter[0], sum );
 		imageStore(s_target, ivec2(dtID.xy), retVal.xxxx);
 	}
 }

BIN
examples/runtime/shaders/dx11/cs_assao_generate_q3.bin


BIN
examples/runtime/shaders/dx11/cs_assao_load_counter_clear.bin


BIN
examples/runtime/shaders/dx11/cs_assao_postprocess_importance_map_b.bin


BIN
examples/runtime/shaders/dx11/cs_assao_prepare_depths_and_normals.bin


BIN
examples/runtime/shaders/dx11/cs_assao_prepare_depths_and_normals_half.bin


BIN
examples/runtime/shaders/glsl/cs_assao_generate_q0.bin


BIN
examples/runtime/shaders/glsl/cs_assao_generate_q1.bin


BIN
examples/runtime/shaders/glsl/cs_assao_generate_q2.bin


BIN
examples/runtime/shaders/glsl/cs_assao_generate_q3.bin


BIN
examples/runtime/shaders/glsl/cs_assao_generate_q3base.bin


BIN
examples/runtime/shaders/glsl/cs_assao_load_counter_clear.bin


BIN
examples/runtime/shaders/glsl/cs_assao_postprocess_importance_map_b.bin


BIN
examples/runtime/shaders/metal/cs_assao_apply.bin


BIN
examples/runtime/shaders/metal/cs_assao_generate_importance_map.bin


BIN
examples/runtime/shaders/metal/cs_assao_generate_q0.bin


BIN
examples/runtime/shaders/metal/cs_assao_generate_q1.bin


BIN
examples/runtime/shaders/metal/cs_assao_generate_q2.bin


BIN
examples/runtime/shaders/metal/cs_assao_generate_q3.bin


BIN
examples/runtime/shaders/metal/cs_assao_generate_q3base.bin


BIN
examples/runtime/shaders/metal/cs_assao_load_counter_clear.bin


BIN
examples/runtime/shaders/metal/cs_assao_non_smart_apply.bin


BIN
examples/runtime/shaders/metal/cs_assao_non_smart_blur.bin


BIN
examples/runtime/shaders/metal/cs_assao_non_smart_half_apply.bin


BIN
examples/runtime/shaders/metal/cs_assao_postprocess_importance_map_a.bin


BIN
examples/runtime/shaders/metal/cs_assao_postprocess_importance_map_b.bin


BIN
examples/runtime/shaders/metal/cs_assao_prepare_depth_mip.bin


BIN
examples/runtime/shaders/metal/cs_assao_prepare_depths.bin


BIN
examples/runtime/shaders/metal/cs_assao_prepare_depths_and_normals.bin


BIN
examples/runtime/shaders/metal/cs_assao_prepare_depths_and_normals_half.bin


BIN
examples/runtime/shaders/metal/cs_assao_prepare_depths_half.bin


BIN
examples/runtime/shaders/metal/cs_assao_smart_blur.bin


BIN
examples/runtime/shaders/metal/cs_assao_smart_blur_wide.bin