v3d: Move the sampler state to the long-lived state uploader.
authorEric Anholt <eric@anholt.net>
Thu, 27 Dec 2018 04:41:42 +0000 (20:41 -0800)
committerEric Anholt <eric@anholt.net>
Sun, 27 Jan 2019 16:30:03 +0000 (08:30 -0800)
Samplers are small (8-24 bytes), so allocating 4k for them is a huge
waste.

src/gallium/drivers/v3d/v3d_context.h
src/gallium/drivers/v3d/v3d_uniforms.c
src/gallium/drivers/v3d/v3dx_state.c

index ef873237c0c1352d05f9d141dec8e22fe1b2466b..1b37681c70268855e4678f091b135e7b117beb13 100644 (file)
@@ -114,7 +114,8 @@ struct v3d_sampler_state {
         /* V3D 3.x: Packed texture state. */
         uint8_t texture_shader_state[32];
         /* V3D 4.x: Sampler state struct. */
-        struct v3d_bo *bo;
+        struct pipe_resource *sampler_state;
+        uint32_t sampler_state_offset;
 };
 
 struct v3d_texture_stateobj {
index 5a3286013cd875c277043b79a89677935900b4d1..1dd9aba9340c81c694dad82752382079946ab566 100644 (file)
@@ -214,7 +214,9 @@ write_tmu_p1(struct v3d_job *job,
         struct pipe_sampler_state *psampler = texstate->samplers[unit];
         struct v3d_sampler_state *sampler = v3d_sampler_state(psampler);
 
-        cl_aligned_reloc(&job->indirect, uniforms, sampler->bo,
+        cl_aligned_reloc(&job->indirect, uniforms,
+                         v3d_resource(sampler->sampler_state)->bo,
+                         sampler->sampler_state_offset |
                          v3d_tmu_config_data_get_value(data));
 }
 
index eafa8853cb9541eed9af9e547104914f76bc2cd5..598a7e870f8e1b446a99e81552fec3426de4a767 100644 (file)
@@ -542,9 +542,13 @@ v3d_create_sampler_state(struct pipe_context *pctx,
                  cso->min_img_filter == PIPE_TEX_MIPFILTER_NEAREST);
 
 #if V3D_VERSION >= 40
-        so->bo = v3d_bo_alloc(v3d->screen, cl_packet_length(SAMPLER_STATE),
-                              "sampler");
-        void *map = v3d_bo_map(so->bo);
+        void *map;
+        u_upload_alloc(v3d->state_uploader, 0,
+                       cl_packet_length(SAMPLER_STATE),
+                       32, /* XXX: 8 for unextended samplers. */
+                       &so->sampler_state_offset,
+                       &so->sampler_state,
+                       &map);
 
         v3dx_pack(map, SAMPLER_STATE, sampler) {
                 sampler.wrap_i_border = false;
@@ -656,7 +660,7 @@ v3d_sampler_state_delete(struct pipe_context *pctx,
         struct pipe_sampler_state *psampler = hwcso;
         struct v3d_sampler_state *sampler = v3d_sampler_state(psampler);
 
-        v3d_bo_unreference(&sampler->bo);
+        pipe_resource_reference(&sampler->sampler_state, NULL);
         free(psampler);
 }