[Mesa-dev] [PATCH] swr: Rework scratch space allocation
Cherniak, Bruce
bruce.cherniak at intel.com
Thu Oct 19 22:32:19 UTC 2017
Reviewed-by: Bruce Cherniak <bruce.cherniak at intel.com>
> On Oct 19, 2017, at 4:40 PM, George Kyriazis <george.kyriazis at 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list