diff options
| author | degasus <wickmarkus@web.de> | 2014-11-13 23:26:49 +0100 |
|---|---|---|
| committer | degasus <wickmarkus@web.de> | 2014-11-17 21:20:32 +0100 |
| commit | c211450b997effa6d91059fb0aaa564892297719 (patch) | |
| tree | fabbfdf698d6e499c53dec988d4b7ba2ef6556bc /Source/Core/VideoCommon/PixelShaderGen.cpp | |
| parent | dced84d4404b1f0346297c5941bfdf94cfdef4d5 (diff) | |
OGL: implement bounding box support with ssbo
This implemention tries to be as accurate as the old SW implemention, but it will remove the dependcy of our vertexloader on videosw.
Diffstat (limited to 'Source/Core/VideoCommon/PixelShaderGen.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/PixelShaderGen.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/Source/Core/VideoCommon/PixelShaderGen.cpp b/Source/Core/VideoCommon/PixelShaderGen.cpp index 0f03fc013b..c0b45fdfda 100644 --- a/Source/Core/VideoCommon/PixelShaderGen.cpp +++ b/Source/Core/VideoCommon/PixelShaderGen.cpp @@ -10,6 +10,7 @@ #include <xlocale.h> #endif +#include "VideoCommon/BoundingBox.h" #include "VideoCommon/BPMemory.h" #include "VideoCommon/ConstantManager.h" #include "VideoCommon/LightingShaderGen.h" @@ -264,6 +265,16 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T "\tfloat4 " I_DEPTHPARAMS";\n" "};\n"); } + + if (g_ActiveConfig.backend_info.bSupportsBBox) + { + out.Write( + "layout(std140, binding = 3) buffer BBox {\n" + "\tint4 bbox_data;\n" + "};\n" + ); + } + const bool forced_early_z = g_ActiveConfig.backend_info.bSupportsEarlyZ && bpmem.UseEarlyDepthTest() && (g_ActiveConfig.bFastDepthCalc || bpmem.alpha_test.TestResult() == AlphaTest::UNDETERMINED); const bool per_pixel_depth = (bpmem.ztex2.op != ZTEXTURE_DISABLE && bpmem.UseLateDepthTest()) || (!g_ActiveConfig.bFastDepthCalc && bpmem.zmode.testenable && !forced_early_z); @@ -551,6 +562,17 @@ static inline void GeneratePixelShader(T& out, DSTALPHA_MODE dstAlphaMode, API_T out.Write("\tocol0.a = float(" I_ALPHA".a) / 255.0;\n"); } + if (g_ActiveConfig.backend_info.bSupportsBBox && BoundingBox::active) + { + uid_data->bounding_box = true; + out.Write( + "\tif(bbox_data.x > int(gl_FragCoord.x)) atomicMin(bbox_data.x, int(gl_FragCoord.x));\n" + "\tif(bbox_data.y < int(gl_FragCoord.x)) atomicMax(bbox_data.y, int(gl_FragCoord.x));\n" + "\tif(bbox_data.z > int(gl_FragCoord.y)) atomicMin(bbox_data.z, int(gl_FragCoord.y));\n" + "\tif(bbox_data.w < int(gl_FragCoord.y)) atomicMax(bbox_data.w, int(gl_FragCoord.y));\n" + ); + } + out.Write("}\n"); if (is_writing_shadercode) |
