summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2017-02-17 02:14:36 +0100
committerMarek Olšák <[email protected]>2017-02-25 00:03:09 +0100
commit7fff5b77f12174610d82d0c14da19fd8e81c92db (patch)
tree2c86a56e04659fd1bac86585374cc15fc5ec37d5
parent19c51e072b6fa614bc9c0f379bf462acd94c5431 (diff)
freedreno: add support for user index buffers
Reviewed-by: Brian Paul <[email protected]>
-rw-r--r--src/gallium/drivers/freedreno/freedreno_draw.c12
-rw-r--r--src/gallium/drivers/freedreno/freedreno_screen.c2
2 files changed, 13 insertions, 1 deletions
diff --git a/src/gallium/drivers/freedreno/freedreno_draw.c b/src/gallium/drivers/freedreno/freedreno_draw.c
index cfe13cd6782..5d5b7c11beb 100644
--- a/src/gallium/drivers/freedreno/freedreno_draw.c
+++ b/src/gallium/drivers/freedreno/freedreno_draw.c
@@ -31,6 +31,7 @@
#include "util/u_memory.h"
#include "util/u_prim.h"
#include "util/u_format.h"
+#include "util/u_helpers.h"
#include "freedreno_draw.h"
#include "freedreno_context.h"
@@ -84,6 +85,14 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
return;
}
+ /* Upload a user index buffer. */
+ struct pipe_index_buffer ibuffer_saved = {};
+ if (info->indexed && ctx->indexbuf.user_buffer &&
+ !util_save_and_upload_index_buffer(pctx, info, &ctx->indexbuf,
+ &ibuffer_saved)) {
+ return;
+ }
+
if (ctx->in_blit) {
fd_batch_reset(batch);
ctx->dirty = ~0;
@@ -201,6 +210,9 @@ fd_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info)
ctx->dirty = 0xffffffff;
fd_batch_check_size(batch);
+
+ if (info->indexed && ibuffer_saved.user_buffer)
+ pctx->set_index_buffer(pctx, &ibuffer_saved);
}
/* Generic clear implementation (partially) using u_blitter: */
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c
index 1122e29269d..e1b95a6debb 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -179,6 +179,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
case PIPE_CAP_STRING_MARKER:
case PIPE_CAP_MIXED_COLOR_DEPTH_BITS:
+ case PIPE_CAP_USER_INDEX_BUFFERS:
return 1;
case PIPE_CAP_VERTEXID_NOBASE:
@@ -253,7 +254,6 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
case PIPE_CAP_USER_VERTEX_BUFFERS:
- case PIPE_CAP_USER_INDEX_BUFFERS:
case PIPE_CAP_QUERY_PIPELINE_STATISTICS:
case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT: