DRW: Rework wireframe overlay implementation

The shader is way simpler and run way faster on lower end hardware
(2x faster on intel HD5000) but did not notice any improvement on AMD Vega.

This also adds a few changes to the way the wireframes are drawn:
- the slider is more linearly progressive.
- optimize display shows all wires and progressively decrease "inner" wires
  intensity. This is subject to change in the future.
- text/surface/metaballs support is pretty rough. More work needs to be done.

This remove the optimization introduced in f1975a4639.
This also removes the GPU side "sharpness" calculation which means that
animated meshes with wireframe display will update slower.
The CPU sharpness calculation has still room for optimization. Also
it is not excluded that GPU calculation can be added back as a
separate preprocessing pass (saving the computation result [compute or
feedback]).

The goal here was to have more speed for static objects and remove
the dependency of having buffer textures with triangle count. This is
preparation work for multithreading the whole DRW manager.
This commit is contained in:
2018-12-07 05:03:01 +01:00
parent 9f5a27c5be
commit e929cad706
12 changed files with 308 additions and 659 deletions

View File

@@ -59,10 +59,7 @@ typedef struct MetaBallBatchCache {
/* Wireframe */
struct {
GPUVertBuf *elem_vbo;
GPUTexture *elem_tx;
GPUTexture *verts_tx;
int tri_count;
GPUBatch *batch;
} face_wire;
/* settings to determine if cache is invalid */
@@ -94,10 +91,7 @@ static void metaball_batch_cache_init(MetaBall *mb)
cache->shaded_triangles = NULL;
cache->is_dirty = false;
cache->pos_nor_in_order = NULL;
cache->face_wire.elem_vbo = NULL;
cache->face_wire.elem_tx = NULL;
cache->face_wire.verts_tx = NULL;
cache->face_wire.tri_count = 0;
cache->face_wire.batch = NULL;
}
static MetaBallBatchCache *metaball_batch_cache_get(MetaBall *mb)
@@ -131,10 +125,7 @@ static void metaball_batch_cache_clear(MetaBall *mb)
return;
}
GPU_VERTBUF_DISCARD_SAFE(cache->face_wire.elem_vbo);
DRW_TEXTURE_FREE_SAFE(cache->face_wire.elem_tx);
DRW_TEXTURE_FREE_SAFE(cache->face_wire.verts_tx);
GPU_BATCH_DISCARD_SAFE(cache->face_wire.batch);
GPU_BATCH_DISCARD_SAFE(cache->batch);
GPU_VERTBUF_DISCARD_SAFE(cache->pos_nor_in_order);
/* Note: shaded_triangles[0] is already freed by cache->batch */
@@ -157,36 +148,6 @@ static GPUVertBuf *mball_batch_cache_get_pos_and_normals(Object *ob, MetaBallBat
return cache->pos_nor_in_order;
}
static GPUTexture *mball_batch_cache_get_edges_overlay_texture_buf(Object *ob, MetaBallBatchCache *cache)
{
if (cache->face_wire.elem_tx != NULL) {
return cache->face_wire.elem_tx;
}
ListBase *lb = &ob->runtime.curve_cache->disp;
/* We need a special index buffer. */
GPUVertBuf *vbo = cache->face_wire.elem_vbo = DRW_displist_create_edges_overlay_texture_buf(lb);
/* Upload data early because we need to create the texture for it. */
GPU_vertbuf_use(vbo);
cache->face_wire.elem_tx = GPU_texture_create_from_vertbuf(vbo);
cache->face_wire.tri_count = vbo->vertex_alloc / 3;
return cache->face_wire.elem_tx;
}
static GPUTexture *mball_batch_cache_get_vert_pos_and_nor_in_order_buf(Object *ob, MetaBallBatchCache *cache)
{
if (cache->face_wire.verts_tx == NULL) {
GPUVertBuf *vbo = mball_batch_cache_get_pos_and_normals(ob, cache);
GPU_vertbuf_use(vbo); /* Upload early for buffer texture creation. */
cache->face_wire.verts_tx = GPU_texture_create_buffer(GPU_R32F, vbo->vbo_id);
}
return cache->face_wire.verts_tx;
}
/* -------------------------------------------------------------------- */
/** \name Public Object/MetaBall API
@@ -232,26 +193,19 @@ GPUBatch **DRW_metaball_batch_cache_get_surface_shaded(Object *ob, MetaBall *mb,
}
void DRW_metaball_batch_cache_get_wireframes_face_texbuf(
Object *ob, struct GPUTexture **verts_data, struct GPUTexture **face_indices, int *tri_count, bool UNUSED(reduce_len))
GPUBatch *DRW_metaball_batch_cache_get_wireframes_face(Object *ob)
{
if (!BKE_mball_is_basis(ob)) {
*verts_data = NULL;
*face_indices = NULL;
*tri_count = 0;
return;
return NULL;
}
MetaBall *mb = ob->data;
MetaBallBatchCache *cache = metaball_batch_cache_get(mb);
if (cache->face_wire.verts_tx == NULL) {
*verts_data = mball_batch_cache_get_vert_pos_and_nor_in_order_buf(ob, cache);
*face_indices = mball_batch_cache_get_edges_overlay_texture_buf(ob, cache);
if (cache->face_wire.batch == NULL) {
ListBase *lb = &ob->runtime.curve_cache->disp;
cache->face_wire.batch = DRW_displist_create_edges_overlay_batch(lb);
}
else {
*verts_data = cache->face_wire.verts_tx;
*face_indices = cache->face_wire.elem_tx;
}
*tri_count = cache->face_wire.tri_count;
return cache->face_wire.batch;
}