Reviewed-by: Bruce Cherniak <bruce.chern...@intel.com> > On Oct 19, 2017, at 4:40 PM, George Kyriazis <george.kyria...@intel.com> > wrote: > > 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. > --- > src/gallium/drivers/swr/swr_scratch.cpp | 51 ++++++++++++++------------------- > src/gallium/drivers/swr/swr_screen.cpp | 2 +- > 2 files changed, 23 insertions(+), 30 deletions(-) > > diff --git a/src/gallium/drivers/swr/swr_scratch.cpp > b/src/gallium/drivers/swr/swr_scratch.cpp > index d298a48..c31f3c2 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. */ > - unsigned int max_size_in_flight = size * KNOB_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. */ > + unsigned int max_size_in_flight = size * KNOB_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); > diff --git a/src/gallium/drivers/swr/swr_screen.cpp > b/src/gallium/drivers/swr/swr_screen.cpp > index 46b3a00..b21c35e 100644 > --- a/src/gallium/drivers/swr/swr_screen.cpp > +++ b/src/gallium/drivers/swr/swr_screen.cpp > @@ -57,7 +57,7 @@ > #define SWR_MAX_TEXTURE_ARRAY_LAYERS 512 /* 8K x 512 / 8K x 8K x 512 */ > > /* Default max client_copy_limit */ > -#define SWR_CLIENT_COPY_LIMIT 32768 > +#define SWR_CLIENT_COPY_LIMIT 8192 > > /* Flag indicates creation of alternate surface, to prevent recursive loop > * in resource creation when msaa_force_enable is set. */ > -- > 2.7.4 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev