summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/swr/swr_scratch.cpp
diff options
context:
space:
mode:
authorGeorge Kyriazis <[email protected]>2017-10-18 14:10:26 -0500
committerGeorge Kyriazis <[email protected]>2017-10-19 20:18:09 -0500
commitf9d239e11fe044de0e977fd1d3a62d9f6a92e49d (patch)
tree93b39c63bd5b9dc1b0c1ce9310d8bf62538c40bc /src/gallium/drivers/swr/swr_scratch.cpp
parentffaf4d608a19cf891036de193489c2f6aecb1b23 (diff)
swr: Rework scratch space allocation
Remove allocation of > 2kbyte buffers into context memory in swr_copy_to_scatch_space() (which is used to copy small vertex/index buffers and shader constants to a scratch space to be used by the upcoming draw.) Large shader constant allocations need to be done in the circular scratch buffer instead of context memory, because their values persist across render calls. Also lower SCRATCH_SINGLE_ALLOCATION_LIMIT to 8k, since allocations of larger buffers will get too large for the circular scratch space. Fixes render issues with CEI Ensight. Reviewed-by: Bruce Cherniak <[email protected]>
Diffstat (limited to 'src/gallium/drivers/swr/swr_scratch.cpp')
-rw-r--r--src/gallium/drivers/swr/swr_scratch.cpp51
1 files changed, 22 insertions, 29 deletions
diff --git a/src/gallium/drivers/swr/swr_scratch.cpp b/src/gallium/drivers/swr/swr_scratch.cpp
index 8afe73c30e4..810132a76c5 100644
--- a/src/gallium/drivers/swr/swr_scratch.cpp
+++ b/src/gallium/drivers/swr/swr_scratch.cpp
@@ -28,8 +28,6 @@
#include "swr_fence_work.h"
#include "api.h"
-#define SCRATCH_SINGLE_ALLOCATION_LIMIT 2048
-
void *
swr_copy_to_scratch_space(struct swr_context *ctx,
struct swr_scratch_space *space,
@@ -40,41 +38,36 @@ swr_copy_to_scratch_space(struct swr_context *ctx,
assert(space);
assert(size);
- if (size >= SCRATCH_SINGLE_ALLOCATION_LIMIT) {
- /* Use per draw SwrAllocDrawContextMemory for larger copies */
- ptr = ctx->api.pfnSwrAllocDrawContextMemory(ctx->swrContext, size, 4);
- } else {
- /* Allocate enough so that MAX_DRAWS_IN_FLIGHT sets fit. */
- uint32_t max_size_in_flight = size * ctx->max_draws_in_flight;
-
- /* Need to grow space */
- if (max_size_in_flight > space->current_size) {
- space->current_size = max_size_in_flight;
+ /* Allocate enough so that MAX_DRAWS_IN_FLIGHT sets fit. */
+ uint32_t max_size_in_flight = size * ctx->max_draws_in_flight;
- if (space->base) {
- /* defer delete, use aligned-free */
- struct swr_screen *screen = swr_screen(ctx->pipe.screen);
- swr_fence_work_free(screen->flush_fence, space->base, true);
- space->base = NULL;
- }
+ /* Need to grow space */
+ if (max_size_in_flight > space->current_size) {
+ space->current_size = max_size_in_flight;
- if (!space->base) {
- space->base = (uint8_t *)AlignedMalloc(space->current_size,
- sizeof(void *));
- space->head = (void *)space->base;
- }
+ if (space->base) {
+ /* defer delete, use aligned-free */
+ struct swr_screen *screen = swr_screen(ctx->pipe.screen);
+ swr_fence_work_free(screen->flush_fence, space->base, true);
+ space->base = NULL;
}
- /* Wrap */
- if (((uint8_t *)space->head + size)
- >= ((uint8_t *)space->base + space->current_size)) {
- space->head = space->base;
+ if (!space->base) {
+ space->base = (uint8_t *)AlignedMalloc(space->current_size,
+ sizeof(void *));
+ space->head = (void *)space->base;
}
+ }
- ptr = space->head;
- space->head = (uint8_t *)space->head + size;
+ /* Wrap */
+ if (((uint8_t *)space->head + size)
+ >= ((uint8_t *)space->base + space->current_size)) {
+ space->head = space->base;
}
+ ptr = space->head;
+ space->head = (uint8_t *)space->head + size;
+
/* Copy user_buffer to scratch */
if (user_buffer)
memcpy(ptr, user_buffer, size);