diff options
author | Julian Eisel <eiseljulian@gmail.com> | 2015-10-21 18:30:35 +0300 |
---|---|---|
committer | Julian Eisel <eiseljulian@gmail.com> | 2015-10-21 18:30:35 +0300 |
commit | 0775680e4d05eda3c495a56dc0b6eafbe96dc586 (patch) | |
tree | 4f3286eef96dec6ababe43467ed2a4f50388b988 /source/blender/gpu/intern/gpu_buffers.c | |
parent | 4ade467fc6adfc13ce9e21d7e50b366fce70ea5f (diff) | |
parent | 6bc007610263c879f6bb30b844ba9d9a0fb9433c (diff) |
Merge branch 'master' into UI-graphical-redesignUI-graphical-redesign
Conflicts:
source/blender/blenkernel/BKE_blender.h
source/blender/blenloader/intern/versioning_270.c
source/blender/editors/interface/interface.c
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/interface_intern.h
source/blender/editors/interface/resources.c
Diffstat (limited to 'source/blender/gpu/intern/gpu_buffers.c')
-rw-r--r-- | source/blender/gpu/intern/gpu_buffers.c | 92 |
1 files changed, 64 insertions, 28 deletions
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c index 2e1b866a160..b4617b9790e 100644 --- a/source/blender/gpu/intern/gpu_buffers.c +++ b/source/blender/gpu/intern/gpu_buffers.c @@ -95,8 +95,6 @@ const GPUBufferTypeSettings gpu_buffer_type_settings[] = { {GL_ELEMENT_ARRAY_BUFFER_ARB, 4}, /* triangles, 1 point since we are allocating from tottriangle points, which account for all points */ {GL_ELEMENT_ARRAY_BUFFER_ARB, 1}, - /* fast triangles */ - {GL_ELEMENT_ARRAY_BUFFER_ARB, 1}, }; #define MAX_GPU_ATTRIB_DATA 32 @@ -1121,6 +1119,9 @@ struct GPU_PBVH_Buffers { GPUBuffer *vert_buf, *index_buf, *index_buf_fast; GLenum index_type; + int *baseelemarray; + void **baseindex; + /* mesh pointers in case buffer allocation fails */ const MPoly *mpoly; const MLoop *mloop; @@ -1607,26 +1608,26 @@ static GPUBuffer *gpu_get_grid_buffer(int gridsize, GLenum *index_type, unsigned #define FILL_FAST_BUFFER(type_) \ { \ - type_ *buffer; \ - buffers->index_buf_fast = GPU_buffer_alloc(sizeof(type_) * 6 * totgrid, false); \ - buffer = GPU_buffer_lock(buffers->index_buf_fast, GPU_BINDING_INDEX); \ - if (buffer) { \ - int i; \ - for (i = 0; i < totgrid; i++) { \ - int currentquad = i * 6; \ - buffer[currentquad] = i * gridsize * gridsize; \ - buffer[currentquad + 1] = i * gridsize * gridsize + gridsize - 1; \ - buffer[currentquad + 2] = (i + 1) * gridsize * gridsize - gridsize; \ - buffer[currentquad + 3] = (i + 1) * gridsize * gridsize - 1; \ - buffer[currentquad + 4] = i * gridsize * gridsize + gridsize - 1; \ - buffer[currentquad + 5] = (i + 1) * gridsize * gridsize - gridsize; \ - } \ - GPU_buffer_unlock(buffers->index_buf_fast, GPU_BINDING_INDEX); \ + type_ *buffer; \ + buffers->index_buf_fast = GPU_buffer_alloc(sizeof(type_) * 6 * totgrid, false); \ + buffer = GPU_buffer_lock(buffers->index_buf_fast, GPU_BINDING_INDEX); \ + if (buffer) { \ + int i; \ + for (i = 0; i < totgrid; i++) { \ + int currentquad = i * 6; \ + buffer[currentquad] = i * gridsize * gridsize + gridsize - 1; \ + buffer[currentquad + 1] = i * gridsize * gridsize; \ + buffer[currentquad + 2] = (i + 1) * gridsize * gridsize - gridsize; \ + buffer[currentquad + 3] = (i + 1) * gridsize * gridsize - 1; \ + buffer[currentquad + 4] = i * gridsize * gridsize + gridsize - 1; \ + buffer[currentquad + 5] = (i + 1) * gridsize * gridsize - gridsize; \ + } \ + GPU_buffer_unlock(buffers->index_buf_fast, GPU_BINDING_INDEX); \ } \ else { \ - GPU_buffer_free(buffers->index_buf_fast); \ - buffers->index_buf_fast = NULL; \ - } \ + GPU_buffer_free(buffers->index_buf_fast); \ + buffers->index_buf_fast = NULL; \ + } \ } (void)0 GPU_PBVH_Buffers *GPU_build_grid_pbvh_buffers(int *grid_indices, int totgrid, @@ -1681,6 +1682,18 @@ GPU_PBVH_Buffers *GPU_build_grid_pbvh_buffers(int *grid_indices, int totgrid, if (buffers->index_buf) buffers->vert_buf = GPU_buffer_alloc(sizeof(VertexBufferFormat) * totgrid * key->grid_area, false); + if (GLEW_ARB_draw_elements_base_vertex) { + int i; + buffers->baseelemarray = MEM_mallocN(sizeof(int) * totgrid * 2, "GPU_PBVH_Buffers.baseelemarray"); + buffers->baseindex = MEM_mallocN(sizeof(void *) * totgrid, "GPU_PBVH_Buffers.baseindex"); + for (i = 0; i < totgrid; i++) { + buffers->baseelemarray[i] = buffers->tot_quad * 6; + buffers->baseelemarray[i + totgrid] = i * key->grid_area; + buffers->baseindex[i] = buffers->index_buf && !buffers->index_buf->use_vbo ? + buffers->index_buf->pointer : NULL; + } + } + return buffers; } @@ -2012,21 +2025,40 @@ void GPU_draw_pbvh_buffers(GPU_PBVH_Buffers *buffers, DMSetMaterial setMaterial, if (buffers->tot_quad) { const char *offset = base; - int i, last = buffers->has_hidden ? 1 : buffers->totgrid; - for (i = 0; i < last; i++) { + const bool drawall = !(buffers->has_hidden || do_fast); + + if (GLEW_ARB_draw_elements_base_vertex && drawall) { + glVertexPointer(3, GL_FLOAT, sizeof(VertexBufferFormat), offset + offsetof(VertexBufferFormat, co)); glNormalPointer(GL_SHORT, sizeof(VertexBufferFormat), offset + offsetof(VertexBufferFormat, no)); glColorPointer(3, GL_UNSIGNED_BYTE, sizeof(VertexBufferFormat), offset + offsetof(VertexBufferFormat, color)); - - if (do_fast) - glDrawElements(GL_TRIANGLES, buffers->totgrid * 6, buffers->index_type, index_base); - else - glDrawElements(GL_TRIANGLES, buffers->tot_quad * 6, buffers->index_type, index_base); - offset += buffers->gridkey.grid_area * sizeof(VertexBufferFormat); + glMultiDrawElementsBaseVertex(GL_TRIANGLES, buffers->baseelemarray, buffers->index_type, + (const void * const *)buffers->baseindex, + buffers->totgrid, &buffers->baseelemarray[buffers->totgrid]); + } + else { + int i, last = drawall ? buffers->totgrid : 1; + + /* we could optimize this to one draw call, but it would need more memory */ + for (i = 0; i < last; i++) { + glVertexPointer(3, GL_FLOAT, sizeof(VertexBufferFormat), + offset + offsetof(VertexBufferFormat, co)); + glNormalPointer(GL_SHORT, sizeof(VertexBufferFormat), + offset + offsetof(VertexBufferFormat, no)); + glColorPointer(3, GL_UNSIGNED_BYTE, sizeof(VertexBufferFormat), + offset + offsetof(VertexBufferFormat, color)); + + if (do_fast) + glDrawElements(GL_TRIANGLES, buffers->totgrid * 6, buffers->index_type, index_base); + else + glDrawElements(GL_TRIANGLES, buffers->tot_quad * 6, buffers->index_type, index_base); + + offset += buffers->gridkey.grid_area * sizeof(VertexBufferFormat); + } } } else if (buffers->tot_tri) { @@ -2112,6 +2144,10 @@ void GPU_free_pbvh_buffers(GPU_PBVH_Buffers *buffers) GPU_buffer_free(buffers->index_buf); if (buffers->index_buf_fast) GPU_buffer_free(buffers->index_buf_fast); + if (buffers->baseelemarray) + MEM_freeN(buffers->baseelemarray); + if (buffers->baseindex) + MEM_freeN(buffers->baseindex); MEM_freeN(buffers); } |