Refactor: Grease Pencil: Port AntiAliasing drawing to new draw manager

_No response_

Pull Request: https://projects.blender.org/blender/blender/pulls/130324
This commit is contained in:
Clément Foucault
2024-11-15 14:32:28 +01:00
committed by Clément Foucault
parent 87cf01efab
commit d04d23bc40
3 changed files with 72 additions and 61 deletions

View File

@@ -14,30 +14,28 @@
void GPENCIL_antialiasing_init(GPENCIL_Data *vedata)
{
GPENCIL_Instance *inst = vedata->instance;
GPENCIL_PrivateData *pd = vedata->stl->pd;
GPENCIL_FramebufferList *fbl = vedata->fbl;
GPENCIL_TextureList *txl = vedata->txl;
GPENCIL_PassList *psl = vedata->psl;
DRWShadingGroup *grp;
const float *size = DRW_viewport_size_get();
const float *sizeinv = DRW_viewport_invert_size_get();
const float metrics[4] = {sizeinv[0], sizeinv[1], size[0], size[1]};
const float4 metrics = {sizeinv[0], sizeinv[1], size[0], size[1]};
if (pd->simplify_antialias) {
/* No AA fallback. */
DRW_PASS_CREATE(psl->smaa_resolve_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_CUSTOM);
GPUShader *sh = GPENCIL_shader_antialiasing(2);
grp = DRW_shgroup_create(sh, psl->smaa_resolve_ps);
DRW_shgroup_uniform_texture(grp, "blendTex", pd->color_tx);
DRW_shgroup_uniform_texture(grp, "colorTex", pd->color_tx);
DRW_shgroup_uniform_texture(grp, "revealTex", pd->reveal_tx);
DRW_shgroup_uniform_bool_copy(grp, "doAntiAliasing", false);
DRW_shgroup_uniform_bool_copy(grp, "onlyAlpha", pd->draw_wireframe);
DRW_shgroup_uniform_vec4_copy(grp, "viewportMetrics", metrics);
DRW_shgroup_call_procedural_triangles(grp, nullptr, 1);
blender::draw::PassSimple &pass = inst->smaa_resolve_ps;
pass.init();
pass.state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_CUSTOM);
pass.shader_set(GPENCIL_shader_antialiasing(2));
pass.bind_texture("blendTex", pd->color_tx);
pass.bind_texture("colorTex", pd->color_tx);
pass.bind_texture("revealTex", pd->reveal_tx);
pass.push_constant("doAntiAliasing", false);
pass.push_constant("onlyAlpha", pd->draw_wireframe);
pass.push_constant("viewportMetrics", metrics);
pass.draw_procedural(GPU_PRIM_TRIS, 1, 3);
return;
}
@@ -78,64 +76,63 @@ void GPENCIL_antialiasing_init(GPENCIL_Data *vedata)
{
/* Stage 1: Edge detection. */
DRW_PASS_CREATE(psl->smaa_edge_ps, DRW_STATE_WRITE_COLOR);
GPUShader *sh = GPENCIL_shader_antialiasing(0);
grp = DRW_shgroup_create(sh, psl->smaa_edge_ps);
DRW_shgroup_uniform_texture(grp, "colorTex", pd->color_tx);
DRW_shgroup_uniform_texture(grp, "revealTex", pd->reveal_tx);
DRW_shgroup_uniform_vec4_copy(grp, "viewportMetrics", metrics);
DRW_shgroup_uniform_float_copy(
grp, "lumaWeight", pd->scene->grease_pencil_settings.smaa_threshold);
DRW_shgroup_clear_framebuffer(grp, GPU_COLOR_BIT, 0, 0, 0, 0, 0.0f, 0x0);
DRW_shgroup_call_procedural_triangles(grp, nullptr, 1);
blender::draw::PassSimple &pass = inst->smaa_edge_ps;
pass.init();
pass.state_set(DRW_STATE_WRITE_COLOR);
pass.shader_set(GPENCIL_shader_antialiasing(0));
pass.bind_texture("colorTex", pd->color_tx);
pass.bind_texture("revealTex", pd->reveal_tx);
pass.push_constant("viewportMetrics", metrics);
pass.push_constant("lumaWeight", pd->scene->grease_pencil_settings.smaa_threshold);
pass.clear_color(float4(0.0f));
pass.draw_procedural(GPU_PRIM_TRIS, 1, 3);
}
{
/* Stage 2: Blend Weight/Coord. */
DRW_PASS_CREATE(psl->smaa_weight_ps, DRW_STATE_WRITE_COLOR);
GPUShader *sh = GPENCIL_shader_antialiasing(1);
grp = DRW_shgroup_create(sh, psl->smaa_weight_ps);
DRW_shgroup_uniform_texture(grp, "edgesTex", pd->smaa_edge_tx);
DRW_shgroup_uniform_texture(grp, "areaTex", txl->smaa_area_tx);
DRW_shgroup_uniform_texture(grp, "searchTex", txl->smaa_search_tx);
DRW_shgroup_uniform_vec4_copy(grp, "viewportMetrics", metrics);
DRW_shgroup_clear_framebuffer(grp, GPU_COLOR_BIT, 0, 0, 0, 0, 0.0f, 0x0);
DRW_shgroup_call_procedural_triangles(grp, nullptr, 1);
blender::draw::PassSimple &pass = inst->smaa_weight_ps;
pass.init();
pass.state_set(DRW_STATE_WRITE_COLOR);
pass.shader_set(GPENCIL_shader_antialiasing(1));
pass.bind_texture("edgesTex", pd->smaa_edge_tx);
pass.bind_texture("areaTex", txl->smaa_area_tx);
pass.bind_texture("searchTex", txl->smaa_search_tx);
pass.push_constant("viewportMetrics", metrics);
pass.clear_color(float4(0.0f));
pass.draw_procedural(GPU_PRIM_TRIS, 1, 3);
}
{
/* Stage 3: Resolve. */
DRW_PASS_CREATE(psl->smaa_resolve_ps, DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_CUSTOM);
GPUShader *sh = GPENCIL_shader_antialiasing(2);
grp = DRW_shgroup_create(sh, psl->smaa_resolve_ps);
DRW_shgroup_uniform_texture(grp, "blendTex", pd->smaa_weight_tx);
DRW_shgroup_uniform_texture(grp, "colorTex", pd->color_tx);
DRW_shgroup_uniform_texture(grp, "revealTex", pd->reveal_tx);
DRW_shgroup_uniform_bool_copy(grp, "doAntiAliasing", true);
DRW_shgroup_uniform_bool_copy(grp, "onlyAlpha", pd->draw_wireframe);
DRW_shgroup_uniform_vec4_copy(grp, "viewportMetrics", metrics);
DRW_shgroup_call_procedural_triangles(grp, nullptr, 1);
blender::draw::PassSimple &pass = inst->smaa_resolve_ps;
pass.init();
pass.state_set(DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_CUSTOM);
pass.shader_set(GPENCIL_shader_antialiasing(2));
pass.bind_texture("blendTex", pd->smaa_weight_tx);
pass.bind_texture("colorTex", pd->color_tx);
pass.bind_texture("revealTex", pd->reveal_tx);
pass.push_constant("doAntiAliasing", true);
pass.push_constant("onlyAlpha", pd->draw_wireframe);
pass.push_constant("viewportMetrics", metrics);
pass.draw_procedural(GPU_PRIM_TRIS, 1, 3);
}
}
void GPENCIL_antialiasing_draw(GPENCIL_Data *vedata)
{
GPENCIL_Instance *inst = vedata->instance;
blender::draw::Manager *manager = DRW_manager_get();
GPENCIL_FramebufferList *fbl = vedata->fbl;
GPENCIL_PrivateData *pd = vedata->stl->pd;
GPENCIL_PassList *psl = vedata->psl;
if (!pd->simplify_antialias) {
GPU_framebuffer_bind(fbl->smaa_edge_fb);
DRW_draw_pass(psl->smaa_edge_ps);
manager->submit(inst->smaa_edge_ps);
GPU_framebuffer_bind(fbl->smaa_weight_fb);
DRW_draw_pass(psl->smaa_weight_ps);
manager->submit(inst->smaa_weight_ps);
}
GPU_framebuffer_bind(pd->scene_fb);
DRW_draw_pass(psl->smaa_resolve_ps);
manager->submit(inst->smaa_resolve_ps);
}

View File

@@ -160,10 +160,6 @@ typedef struct GPENCIL_PassList {
struct DRWPass *merge_depth_ps;
/* Invert mask buffer content. */
struct DRWPass *mask_invert_ps;
/* Anti-Aliasing. */
struct DRWPass *smaa_edge_ps;
struct DRWPass *smaa_weight_ps;
struct DRWPass *smaa_resolve_ps;
} GPENCIL_PassList;
typedef struct GPENCIL_FramebufferList {
@@ -192,13 +188,22 @@ typedef struct GPENCIL_TextureList {
struct GPUTexture *render_color_tx;
} GPENCIL_TextureList;
typedef struct GPENCIL_Data {
struct GPENCIL_Instance {
blender::draw::PassSimple smaa_edge_ps = {"smaa_edge"};
blender::draw::PassSimple smaa_weight_ps = {"smaa_weight"};
blender::draw::PassSimple smaa_resolve_ps = {"smaa_resolve"};
};
struct GPENCIL_Data {
void *engine_type; /* Required */
struct GPENCIL_FramebufferList *fbl;
struct GPENCIL_TextureList *txl;
struct GPENCIL_PassList *psl;
struct GPENCIL_StorageList *stl;
} GPENCIL_Data;
struct GPENCIL_Instance *instance;
char info[GPU_INFO_SIZE];
};
/* *********** STATIC *********** */
typedef struct GPENCIL_PrivateData {

View File

@@ -59,6 +59,10 @@ void GPENCIL_engine_init(void *ved)
const DRWContextState *ctx = DRW_context_state_get();
const View3D *v3d = ctx->v3d;
if (vedata->instance == nullptr) {
vedata->instance = new GPENCIL_Instance();
}
if (!stl->pd) {
stl->pd = static_cast<GPENCIL_PrivateData *>(
MEM_callocN(sizeof(GPENCIL_PrivateData), "GPENCIL_PrivateData"));
@@ -938,6 +942,11 @@ static void GPENCIL_engine_free()
GPENCIL_shader_free();
}
static void GPENCIL_instance_free(void *instance)
{
delete reinterpret_cast<GPENCIL_Instance *>(instance);
}
static const DrawEngineDataSize GPENCIL_data_size = DRW_VIEWPORT_DATA_SIZE(GPENCIL_Data);
DrawEngineType draw_engine_gpencil_type = {
@@ -947,7 +956,7 @@ DrawEngineType draw_engine_gpencil_type = {
/*vedata_size*/ &GPENCIL_data_size,
/*engine_init*/ &GPENCIL_engine_init,
/*engine_free*/ &GPENCIL_engine_free,
/*instance_free*/ nullptr,
/*instance_free*/ &GPENCIL_instance_free,
/*cache_init*/ &GPENCIL_cache_init,
/*cache_populate*/ &GPENCIL_cache_populate,
/*cache_finish*/ &GPENCIL_cache_finish,