cso: Optimize cso_save/restore_fragment_samplers
authorMichel Dänzer <michel.daenzer@amd.com>
Fri, 16 Dec 2016 09:00:33 +0000 (18:00 +0900)
committerMichel Dänzer <michel@daenzer.net>
Mon, 19 Dec 2016 08:50:21 +0000 (17:50 +0900)
Only copy/memset the pointers that actually need to be.

v2:
* Cast info->nr_samplers to int for calculating delta (Nicolai)

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/auxiliary/cso_cache/cso_context.c

index f52969d3668ca3ba4d0fda58ae09fea0fbbcaa73..0f4a333ab0accc83656b59abf0789073f1b5db1f 100644 (file)
@@ -1267,8 +1267,10 @@ cso_save_fragment_samplers(struct cso_context *ctx)
    struct sampler_info *saved = &ctx->fragment_samplers_saved;
 
    saved->nr_samplers = info->nr_samplers;
-   memcpy(saved->cso_samplers, info->cso_samplers, sizeof(info->cso_samplers));
-   memcpy(saved->samplers, info->samplers, sizeof(info->samplers));
+   memcpy(saved->cso_samplers, info->cso_samplers, info->nr_samplers *
+          sizeof(*info->cso_samplers));
+   memcpy(saved->samplers, info->samplers, info->nr_samplers *
+          sizeof(*info->samplers));
 }
 
 
@@ -1277,9 +1279,20 @@ cso_restore_fragment_samplers(struct cso_context *ctx)
 {
    struct sampler_info *info = &ctx->samplers[PIPE_SHADER_FRAGMENT];
    struct sampler_info *saved = &ctx->fragment_samplers_saved;
+   int delta = (int)info->nr_samplers - saved->nr_samplers;
+
+   memcpy(info->cso_samplers, saved->cso_samplers,
+          saved->nr_samplers * sizeof(*info->cso_samplers));
+   memcpy(info->samplers, saved->samplers,
+          saved->nr_samplers * sizeof(*info->samplers));
+
+   if (delta > 0) {
+      memset(&info->cso_samplers[saved->nr_samplers], 0,
+             delta * sizeof(*info->cso_samplers));
+      memset(&info->samplers[saved->nr_samplers], 0,
+             delta * sizeof(*info->samplers));
+   }
 
-   memcpy(info->cso_samplers, saved->cso_samplers, sizeof(info->cso_samplers));
-   memcpy(info->samplers, saved->samplers, sizeof(info->samplers));
    cso_single_sampler_done(ctx, PIPE_SHADER_FRAGMENT);
 }