Eevee: Prepare for fullres tracing

This commit is contained in:
Clément Foucault 2018-09-11 16:15:34 +02:00
parent aa5c543a7f
commit 5a7c3d5a08
5 changed files with 49 additions and 19 deletions

View File

@ -43,6 +43,7 @@ static struct {
struct GPUShader *maxz_downdepth_sh;
struct GPUShader *minz_downdepth_layer_sh;
struct GPUShader *maxz_downdepth_layer_sh;
struct GPUShader *maxz_copydepth_layer_sh;
struct GPUShader *minz_copydepth_sh;
struct GPUShader *maxz_copydepth_sh;
@ -109,6 +110,11 @@ static void eevee_create_shader_downsample(void)
datatoc_effect_minmaxz_frag_glsl,
"#define MAX_PASS\n"
"#define LAYERED\n");
e_data.maxz_copydepth_layer_sh = DRW_shader_create_fullscreen(
datatoc_effect_minmaxz_frag_glsl,
"#define MAX_PASS\n"
"#define COPY_DEPTH\n"
"#define LAYERED\n");
e_data.minz_copydepth_sh = DRW_shader_create_fullscreen(
datatoc_effect_minmaxz_frag_glsl,
"#define MIN_PASS\n"
@ -194,9 +200,12 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object
/**
* MinMax Pyramid
*/
int size[2];
size[0] = max_ii(size_fs[0] / 2, 1);
size[1] = max_ii(size_fs[1] / 2, 1);
const bool half_res_hiz = true;
int size[2], div;
common_data->hiz_mip_offset = (half_res_hiz) ? 1 : 0;
div = (half_res_hiz) ? 2 : 1;
size[0] = max_ii(size_fs[0] / div, 1);
size[1] = max_ii(size_fs[1] / div, 1);
if (GPU_type_matches(GPU_DEVICE_INTEL, GPU_OS_ANY, GPU_DRIVER_ANY)) {
/* Intel gpu seems to have problem rendering to only depth format */
@ -214,16 +223,12 @@ void EEVEE_effects_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, Object
* Compute Mipmap texel alignement.
*/
for (int i = 0; i < 10; ++i) {
float mip_size[2] = {viewport_size[0], viewport_size[1]};
for (int j = 0; j < i; ++j) {
mip_size[0] = floorf(fmaxf(1.0f, mip_size[0] / 2.0f));
mip_size[1] = floorf(fmaxf(1.0f, mip_size[1] / 2.0f));
}
common_data->mip_ratio[i][0] = viewport_size[0] / (mip_size[0] * powf(2.0f, floorf(log2f(floorf(viewport_size[0] / mip_size[0])))));
common_data->mip_ratio[i][1] = viewport_size[1] / (mip_size[1] * powf(2.0f, floorf(log2f(floorf(viewport_size[1] / mip_size[1])))));
int mip_size[2];
GPU_texture_get_mipmap_size(txl->color, i, mip_size);
common_data->mip_ratio[i][0] = viewport_size[0] / (mip_size[0] * powf(2.0f, i));
common_data->mip_ratio[i][1] = viewport_size[1] / (mip_size[1] * powf(2.0f, i));
}
/**
* Normal buffer for deferred passes.
*/
@ -357,6 +362,13 @@ void EEVEE_effects_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata)
grp = DRW_shgroup_create(e_data.maxz_copydepth_sh, psl->maxz_copydepth_ps);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &e_data.depth_src);
DRW_shgroup_call_add(grp, quad, NULL);
psl->maxz_copydepth_layer_ps = DRW_pass_create(
"HiZ Max Copy DepthLayer Halfres", downsample_write | DRW_STATE_DEPTH_ALWAYS);
grp = DRW_shgroup_create(e_data.maxz_copydepth_layer_sh, psl->maxz_copydepth_layer_ps);
DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &e_data.depth_src);
DRW_shgroup_uniform_int(grp, "depthLayer", &e_data.depth_src_layer, 1);
DRW_shgroup_call_add(grp, quad, NULL);
}
if ((effects->enabled_effects & EFFECT_VELOCITY_BUFFER) != 0) {
@ -425,16 +437,30 @@ void EEVEE_create_minmax_buffer(EEVEE_Data *vedata, GPUTexture *depth_src, int l
GPU_framebuffer_recursive_downsample(fbl->downsample_fb, stl->g_data->minzbuffer, 8, &min_downsample_cb, vedata);
DRW_stats_group_end();
#endif
int minmax_size[2], depth_size[2];
GPU_texture_get_mipmap_size(depth_src, 0, depth_size);
GPU_texture_get_mipmap_size(txl->maxzbuffer, 0, minmax_size);
bool is_full_res_minmaxz = (minmax_size[0] == depth_size[0] && minmax_size[1] == depth_size[1]);
DRW_stats_group_start("Max buffer");
/* Copy depth buffer to max texture top level */
GPU_framebuffer_texture_attach(fbl->downsample_fb, txl->maxzbuffer, 0, 0);
GPU_framebuffer_bind(fbl->downsample_fb);
if (layer >= 0) {
DRW_draw_pass(psl->maxz_downdepth_layer_ps);
if (is_full_res_minmaxz) {
DRW_draw_pass(psl->maxz_copydepth_layer_ps);
}
else {
DRW_draw_pass(psl->maxz_downdepth_layer_ps);
}
}
else {
DRW_draw_pass(psl->maxz_downdepth_ps);
if (is_full_res_minmaxz) {
DRW_draw_pass(psl->maxz_copydepth_ps);
}
else {
DRW_draw_pass(psl->maxz_downdepth_ps);
}
}
/* Create lower levels */
@ -552,6 +578,7 @@ void EEVEE_effects_free(void)
DRW_SHADER_FREE_SAFE(e_data.maxz_downdepth_sh);
DRW_SHADER_FREE_SAFE(e_data.minz_downdepth_layer_sh);
DRW_SHADER_FREE_SAFE(e_data.maxz_downdepth_layer_sh);
DRW_SHADER_FREE_SAFE(e_data.maxz_copydepth_layer_sh);
DRW_SHADER_FREE_SAFE(e_data.minz_copydepth_sh);
DRW_SHADER_FREE_SAFE(e_data.maxz_copydepth_sh);
}

View File

@ -243,6 +243,7 @@ typedef struct EEVEE_PassList {
struct DRWPass *maxz_downdepth_layer_ps;
struct DRWPass *minz_copydepth_ps;
struct DRWPass *maxz_copydepth_ps;
struct DRWPass *maxz_copydepth_layer_ps;
struct DRWPass *depth_pass;
struct DRWPass *depth_pass_cull;
@ -651,6 +652,8 @@ typedef struct EEVEE_CommonUniformBuffer {
int prb_irradiance_vis_size; /* int */
float prb_lod_cube_max; /* float */
float prb_lod_planar_max; /* float */
/* Misc */
int hiz_mip_offset; /* int */
} EEVEE_CommonUniformBuffer;
/* ***************** CLIP PLANES DATA **************** */

View File

@ -60,8 +60,9 @@ vec2 get_ao_dir(float jitter)
void get_max_horizon_grouped(vec4 co1, vec4 co2, vec3 x, float lod, inout float h)
{
co1 *= mipRatio[int(lod + 1.0)].xyxy; /* +1 because we are using half res top level */
co2 *= mipRatio[int(lod + 1.0)].xyxy; /* +1 because we are using half res top level */
int mip = int(lod) + hizMipOffset;
co1 *= mipRatio[mip].xyxy;
co2 *= mipRatio[mip].xyxy;
float depth1 = textureLod(maxzBuffer, co1.xy, floor(lod)).r;
float depth2 = textureLod(maxzBuffer, co1.zw, floor(lod)).r;

View File

@ -36,6 +36,8 @@ layout(std140) uniform common_block {
int prbIrradianceVisSize;
float prbLodCubeMax;
float prbLodPlanarMax;
/* Misc*/
int hizMipOffset;
};
/* aoParameters */

View File

@ -9,10 +9,7 @@ float sample_depth(vec2 uv, int index, float lod)
else {
#endif
/* Correct UVs for mipmaping mis-alignment */
/* + 1.0 because we are using half res maxzBuffer
* and mipRatio starts at on mip 0. */
int mip = int(lod + 1.0);
uv *= mipRatio[mip];
uv *= mipRatio[int(lod) + hizMipOffset];
return textureLod(maxzBuffer, uv, lod).r;
#ifdef PLANAR_PROBE_RAYTRACE
}