[Bf-blender-cvs] [827ad60] viewport_experiments: Hook up flags to request a specific sorting scheme from GPU buffer setup routines. (still inactive )
Antony Riakiotakis
noreply at git.blender.org
Tue Sep 16 18:30:57 CEST 2014
Commit: 827ad6075dcf144025db7c4319e9954dcf45b26c
Author: Antony Riakiotakis
Date: Tue Sep 16 18:11:54 2014 +0200
Branches: viewport_experiments
https://developer.blender.org/rB827ad6075dcf144025db7c4319e9954dcf45b26c
Hook up flags to request a specific sorting scheme from GPU buffer setup
routines. (still inactive
)
===================================================================
M source/blender/blenkernel/intern/cdderivedmesh.c
M source/blender/editors/sculpt_paint/paint_vertex.c
M source/blender/editors/space_view3d/drawmesh.c
M source/blender/gpu/GPU_buffers.h
M source/blender/gpu/intern/gpu_buffers.c
===================================================================
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 116f9d9..2b4ef5c 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -348,15 +348,15 @@ static void cdDM_drawVerts(DerivedMesh *dm)
MVert *mv = cddm->mvert;
int i;
- if (GPU_buffer_legacy(dm)) {
+ if (GPU_buffer_legacy(dm, GPU_SORT_NONE)) {
glBegin(GL_POINTS);
for (i = 0; i < dm->numVertData; i++, mv++)
glVertex3fv(mv->co);
glEnd();
}
else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */
- GPU_vertex_setup(dm);
- if (!GPU_buffer_legacy(dm)) {
+ GPU_vertex_setup(dm, GPU_SORT_NONE);
+ if (!GPU_buffer_legacy(dm, GPU_SORT_NONE)) {
if (dm->drawObject->tot_triangle_point)
glDrawArrays(GL_POINTS, 0, dm->drawObject->tot_triangle_point);
else
@@ -374,7 +374,7 @@ static void cdDM_drawUVEdges(DerivedMesh *dm)
int i;
if (mf) {
- if (GPU_buffer_legacy(dm)) {
+ if (GPU_buffer_legacy(dm, GPU_SORT_NONE)) {
glBegin(GL_LINES);
for (i = 0; i < dm->numTessFaceData; i++, mf++, tf++) {
if (!(mf->flag & ME_HIDE)) {
@@ -405,8 +405,8 @@ static void cdDM_drawUVEdges(DerivedMesh *dm)
int draw = 1;
int curpos = 0;
- GPU_uvedge_setup(dm);
- if (!GPU_buffer_legacy(dm)) {
+ GPU_uvedge_setup(dm, GPU_SORT_NONE);
+ if (!GPU_buffer_legacy(dm, GPU_SORT_NONE)) {
for (i = 0; i < dm->numTessFaceData; i++, mf++) {
if (!(mf->flag & ME_HIDE)) {
draw = 1;
@@ -452,7 +452,7 @@ static void cdDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEdg
return;
}
- if (GPU_buffer_legacy(dm)) {
+ if (GPU_buffer_legacy(dm, GPU_SORT_NONE)) {
DEBUG_VBO("Using legacy code. cdDM_drawEdges\n");
glBegin(GL_LINES);
for (i = 0; i < dm->numEdgeData; i++, medge++) {
@@ -470,8 +470,8 @@ static void cdDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEdg
int prevdraw = 1;
bool draw = true;
- GPU_edge_setup(dm);
- if (!GPU_buffer_legacy(dm)) {
+ GPU_edge_setup(dm, GPU_SORT_NONE);
+ if (!GPU_buffer_legacy(dm, GPU_SORT_NONE)) {
for (i = 0; i < dm->numEdgeData; i++, medge++) {
if ((drawAllEdges || (medge->flag & ME_EDGEDRAW)) &&
(drawLooseEdges || !(medge->flag & ME_LOOSEEDGE)))
@@ -504,7 +504,7 @@ static void cdDM_drawLooseEdges(DerivedMesh *dm)
MEdge *medge = cddm->medge;
int i;
- if (GPU_buffer_legacy(dm)) {
+ if (GPU_buffer_legacy(dm, GPU_SORT_NONE)) {
DEBUG_VBO("Using legacy code. cdDM_drawLooseEdges\n");
glBegin(GL_LINES);
for (i = 0; i < dm->numEdgeData; i++, medge++) {
@@ -520,8 +520,8 @@ static void cdDM_drawLooseEdges(DerivedMesh *dm)
int prevdraw = 1;
int draw = 1;
- GPU_edge_setup(dm);
- if (!GPU_buffer_legacy(dm)) {
+ GPU_edge_setup(dm, GPU_SORT_NONE);
+ if (!GPU_buffer_legacy(dm, GPU_SORT_NONE)) {
for (i = 0; i < dm->numEdgeData; i++, medge++) {
if (medge->flag & ME_LOOSEEDGE) {
draw = 1;
@@ -568,7 +568,7 @@ static void cdDM_drawFacesSolid(DerivedMesh *dm,
return;
}
- if (GPU_buffer_legacy(dm)) {
+ if (GPU_buffer_legacy(dm, GPU_SORT_MATERIAL)) {
DEBUG_VBO("Using legacy code. cdDM_drawFacesSolid\n");
glBegin(glmode = GL_QUADS);
for (a = 0; a < dm->numTessFaceData; a++, mface++) {
@@ -649,9 +649,9 @@ static void cdDM_drawFacesSolid(DerivedMesh *dm,
glEnd();
}
else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */
- GPU_vertex_setup(dm);
- GPU_normal_setup(dm);
- if (!GPU_buffer_legacy(dm)) {
+ GPU_vertex_setup(dm, GPU_SORT_MATERIAL);
+ GPU_normal_setup(dm, GPU_SORT_MATERIAL);
+ if (!GPU_buffer_legacy(dm, GPU_SORT_MATERIAL)) {
glShadeModel(GL_SMOOTH);
for (a = 0; a < dm->drawObject->totmaterial; a++) {
if (!setMaterial || setMaterial(dm->drawObject->materials[a].mat_nr + 1, NULL)) {
@@ -719,7 +719,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
cdDM_update_normals_from_pbvh(dm);
- if (GPU_buffer_legacy(dm)) {
+ if (GPU_buffer_legacy(dm, GPU_SORT_MATERIAL_TEXTURE)) {
int mat_nr_cache = -1;
MTFace *tf_base = DM_get_tessface_data_layer(dm, CD_MTFACE);
MTFace *tf_stencil_base = NULL;
@@ -844,17 +844,17 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm,
}
}
else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */
- GPU_vertex_setup(dm);
- GPU_normal_setup(dm);
+ GPU_vertex_setup(dm, GPU_SORT_MATERIAL_TEXTURE);
+ GPU_normal_setup(dm, GPU_SORT_MATERIAL_TEXTURE);
if (uvflag & DM_DRAW_USE_TEXPAINT_UV)
- GPU_texpaint_uv_setup(dm);
+ GPU_texpaint_uv_setup(dm, GPU_SORT_MATERIAL_TEXTURE);
else
- GPU_uv_setup(dm);
+ GPU_uv_setup(dm, GPU_SORT_MATERIAL_TEXTURE);
if (mcol) {
- GPU_color_setup(dm, colType);
+ GPU_color_setup(dm, colType, GPU_SORT_MATERIAL_TEXTURE);
}
- if (!GPU_buffer_legacy(dm)) {
+ if (!GPU_buffer_legacy(dm, GPU_SORT_MATERIAL_TEXTURE)) {
int tottri = dm->drawObject->tot_triangle_point / 3;
int next_actualFace = dm->drawObject->triangle_to_mface[0];
@@ -969,7 +969,7 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
/* back-buffer always uses legacy since VBO's would need the
* color array temporarily overwritten for drawing, then reset. */
- if (GPU_buffer_legacy(dm) || G.f & G_BACKBUFSEL) {
+ if (GPU_buffer_legacy(dm, GPU_SORT_MATERIAL) || G.f & G_BACKBUFSEL) {
DEBUG_VBO("Using legacy code. cdDM_drawMappedFaces\n");
for (i = 0; i < dm->numTessFaceData; i++, mf++) {
int drawSmooth = ((flag & DM_DRAW_ALWAYS_SMOOTH) || lnors) ? 1 : (mf->flag & ME_SMOOTH);
@@ -1071,12 +1071,12 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm,
}
else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */
int prevstart = 0;
- GPU_vertex_setup(dm);
- GPU_normal_setup(dm);
+ GPU_vertex_setup(dm, GPU_SORT_MATERIAL);
+ GPU_normal_setup(dm, GPU_SORT_MATERIAL);
if (useColors && mcol) {
- GPU_color_setup(dm, colType);
+ GPU_color_setup(dm, colType, GPU_SORT_MATERIAL);
}
- if (!GPU_buffer_legacy(dm)) {
+ if (!GPU_buffer_legacy(dm, GPU_SORT_MATERIAL)) {
int tottri = dm->drawObject->tot_triangle_point / 3;
glShadeModel(GL_SMOOTH);
@@ -1271,7 +1271,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm,
glShadeModel(GL_SMOOTH);
- if (GPU_buffer_legacy(dm) || setDrawOptions != NULL) {
+ if (GPU_buffer_legacy(dm, GPU_SORT_MATERIAL) || setDrawOptions != NULL) {
DEBUG_VBO("Using legacy code. cdDM_drawMappedFacesGLSL\n");
memset(&attribs, 0, sizeof(attribs));
@@ -1355,10 +1355,10 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm,
GPUAttrib datatypes[GPU_MAX_ATTRIB]; /* TODO, messing up when switching materials many times - [#21056]*/
memset(&attribs, 0, sizeof(attribs));
- GPU_vertex_setup(dm);
- GPU_normal_setup(dm);
+ GPU_vertex_setup(dm, GPU_SORT_MATERIAL);
+ GPU_normal_setup(dm, GPU_SORT_MATERIAL);
- if (!GPU_buffer_legacy(dm)) {
+ if (!GPU_buffer_legacy(dm, GPU_SORT_MATERIAL)) {
for (i = 0; i < dm->drawObject->tot_triangle_point / 3; i++) {
a = dm->drawObject->triangle_to_mface[i];
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 509a7f3..4edecb1 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -3024,7 +3024,7 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
* avoid this if we can! */
DAG_id_tag_update(ob->data, 0);
}
- else if (!GPU_buffer_legacy(ob->derivedFinal)) {
+ else if (!GPU_buffer_legacy(ob->derivedFinal, GPU_SORT_MATERIAL)) {
/* If using new VBO drawing, mark mcol as dirty to force colors gpu buffer refresh! */
ob->derivedFinal->dirty |= DM_DIRTY_MCOL_UPDATE_DRAW;
}
diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c
index fb97a6a..d9ad15e 100644
--- a/source/blender/editors/space_view3d/drawmesh.c
+++ b/source/blender/editors/space_view3d/drawmesh.c
@@ -922,7 +922,7 @@ static void draw_mesh_textured_old(Scene *scene, View3D *v3d, RegionView3D *rv3d
}
}
else {
- if (GPU_buffer_legacy(dm)) {
+ if (GPU_buffer_legacy(dm, GPU_SORT_MATERIAL)) {
if (draw_flags & DRAW_MODIFIERS_PREVIEW)
dm->drawFacesTex(dm, draw_mcol__set_draw_legacy, NULL, NULL, uvflag);
else
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index c690b0c..e152acf 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -133,18 +133,25 @@ void GPU_global_buffer_pool_free_unused(void);
GPUBuffer *GPU_buffer_alloc(int size);
void GPU_buffer_free(GPUBuffer *buffer);
-GPUDrawObject *GPU_drawobject_new(struct DerivedMesh *dm);
+/* how are vertex data sorted */
+typedef enum GPUSortType {
+ GPU_SORT_NONE = 0, /* no sorting, just dump data */
+ GPU_SORT_MATERIAL = 1, /* sort based on materials only */
+ GPU_SORT_MATERIAL_TEXTURE = 2 /* sort based on materials and textures */
+} GPUSortType;
+
+GPUDrawObject *GPU_drawobject_new(struct DerivedMesh *dm, GPUSortType type);
void GPU_drawobject_free(struct DerivedMesh *dm);
/* called before drawing */
-void GPU_vertex_setup(struct DerivedMesh *dm);
-void GPU_normal_setup(struct DerivedMesh *dm);
-void GPU_uv_setup(struct DerivedMesh *dm);
-void GPU_texpaint_uv_setup(struct DerivedMesh *dm);
+void GPU_vertex_setup(struct DerivedMesh *dm, GPUSortType type);
+void GPU_normal_setup(struct DerivedMesh *dm, GPUSortType type);
+void GPU_uv_setup(struct DerivedMesh *dm, GPUSortType type);
+void GPU_texpaint_uv_setup(struct DerivedMesh *dm, GPUSortType type);
/* colType is the cddata MCol type to use! */
-void GPU_color_setup(struct DerivedMesh *dm, int colType);
-void GPU_edge_setup(struct DerivedMesh *dm); /* does not mix with other data */
-void GPU_uvedge_setup(struct DerivedMesh *dm);
+void GPU_color_setup(struct DerivedMesh *dm, int colType, GPUSortType type);
+void GPU_edge_setup(struct DerivedMesh *dm, GPUSortType type); /* does not mix with other data */
+void GPU_uvedge_setup(struct DerivedMesh *dm, GPUSortType type);
int GPU_attrib_ele
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list