@@ -248,11 +248,58 @@ static void update_shader_uniform_locs(ShaderBinding *binding)
248
248
}
249
249
}
250
250
251
+ static ShaderModuleInfo *
252
+ get_and_ref_shader_module_for_key (PGRAPHVkState * r , ShaderModuleCacheKey * key )
253
+ {
254
+ uint64_t hash = fast_hash ((void * )key , sizeof (ShaderModuleCacheKey ));
255
+ LruNode * node = lru_lookup (& r -> shader_module_cache , hash , key );
256
+ ShaderModuleCacheEntry * module =
257
+ container_of (node , ShaderModuleCacheEntry , node );
258
+ pgraph_vk_ref_shader_module (module -> module_info );
259
+ return module -> module_info ;
260
+ }
261
+
251
262
static void shader_cache_entry_init (Lru * lru , LruNode * node , void * state )
252
263
{
253
- ShaderBinding * snode = container_of (node , ShaderBinding , node );
254
- memcpy (& snode -> state , state , sizeof (ShaderState ));
255
- snode -> initialized = false;
264
+ PGRAPHVkState * r = container_of (lru , PGRAPHVkState , shader_cache );
265
+ ShaderBinding * binding = container_of (node , ShaderBinding , node );
266
+ memcpy (& binding -> state , state , sizeof (ShaderState ));
267
+
268
+ NV2A_VK_DPRINTF ("cache miss" );
269
+ nv2a_profile_inc_counter (NV2A_PROF_SHADER_GEN );
270
+
271
+ ShaderModuleCacheKey key ;
272
+
273
+ bool need_geometry_shader = pgraph_glsl_need_geom (& binding -> state .geom );
274
+ if (need_geometry_shader ) {
275
+ memset (& key , 0 , sizeof (key ));
276
+ key .kind = VK_SHADER_STAGE_GEOMETRY_BIT ;
277
+ key .geom .state = binding -> state .geom ;
278
+ key .geom .glsl_opts .vulkan = true;
279
+ binding -> geom .module_info = get_and_ref_shader_module_for_key (r , & key );
280
+ } else {
281
+ binding -> geom .module_info = NULL ;
282
+ }
283
+
284
+ memset (& key , 0 , sizeof (key ));
285
+ key .kind = VK_SHADER_STAGE_VERTEX_BIT ;
286
+ key .vsh .state = binding -> state .vsh ;
287
+ key .vsh .glsl_opts .vulkan = true;
288
+ key .vsh .glsl_opts .prefix_outputs = need_geometry_shader ;
289
+ key .vsh .glsl_opts .use_push_constants_for_uniform_attrs =
290
+ r -> use_push_constants_for_uniform_attrs ;
291
+ key .vsh .glsl_opts .ubo_binding = VSH_UBO_BINDING ;
292
+ binding -> vsh .module_info = get_and_ref_shader_module_for_key (r , & key );
293
+
294
+ memset (& key , 0 , sizeof (key ));
295
+ key .kind = VK_SHADER_STAGE_FRAGMENT_BIT ;
296
+ key .psh .state = binding -> state .psh ;
297
+ key .psh .glsl_opts .vulkan = true;
298
+ key .psh .glsl_opts .ubo_binding = PSH_UBO_BINDING ;
299
+ key .psh .glsl_opts .tex_binding = PSH_TEX_BINDING ;
300
+ binding -> psh .module_info = get_and_ref_shader_module_for_key (r , & key );
301
+
302
+ update_shader_uniform_locs (binding );
256
303
}
257
304
258
305
static void shader_cache_entry_post_evict (Lru * lru , LruNode * node )
@@ -270,8 +317,6 @@ static void shader_cache_entry_post_evict(Lru *lru, LruNode *node)
270
317
pgraph_vk_unref_shader_module (r , modules [i ]);
271
318
}
272
319
}
273
-
274
- snode -> initialized = false;
275
320
}
276
321
277
322
static bool shader_cache_entry_compare (Lru * lru , LruNode * node , void * key )
@@ -375,69 +420,14 @@ static void shader_cache_finalize(PGRAPHState *pg)
375
420
r -> shader_module_cache_entries = NULL ;
376
421
}
377
422
378
- static ShaderModuleInfo *
379
- get_and_ref_shader_module_for_key (PGRAPHVkState * r , ShaderModuleCacheKey * key )
380
- {
381
- uint64_t hash = fast_hash ((void * )key , sizeof (ShaderModuleCacheKey ));
382
- LruNode * node = lru_lookup (& r -> shader_module_cache , hash , key );
383
- ShaderModuleCacheEntry * module =
384
- container_of (node , ShaderModuleCacheEntry , node );
385
- pgraph_vk_ref_shader_module (module -> module_info );
386
- return module -> module_info ;
387
- }
388
-
389
- static ShaderBinding * gen_shaders (PGRAPHState * pg , ShaderState * state )
423
+ static ShaderBinding * get_shader_binding_for_state (PGRAPHVkState * r ,
424
+ ShaderState * state )
390
425
{
391
- PGRAPHVkState * r = pg -> vk_renderer_state ;
392
-
393
426
uint64_t hash = fast_hash ((void * )state , sizeof (* state ));
394
427
LruNode * node = lru_lookup (& r -> shader_cache , hash , state );
395
- ShaderBinding * snode = container_of (node , ShaderBinding , node );
396
-
397
- NV2A_VK_DPRINTF ("shader state hash: %016" PRIx64 " %p" , hash , snode );
398
-
399
- if (!snode -> initialized ) {
400
- NV2A_VK_DPRINTF ("cache miss" );
401
- nv2a_profile_inc_counter (NV2A_PROF_SHADER_GEN );
402
-
403
- ShaderModuleCacheKey key ;
404
-
405
- bool need_geometry_shader = pgraph_glsl_need_geom (& state -> geom );
406
- if (need_geometry_shader ) {
407
- memset (& key , 0 , sizeof (key ));
408
- key .kind = VK_SHADER_STAGE_GEOMETRY_BIT ;
409
- key .geom .state = state -> geom ;
410
- key .geom .glsl_opts .vulkan = true;
411
- snode -> geom .module_info =
412
- get_and_ref_shader_module_for_key (r , & key );
413
- } else {
414
- snode -> geom .module_info = NULL ;
415
- }
416
-
417
- memset (& key , 0 , sizeof (key ));
418
- key .kind = VK_SHADER_STAGE_VERTEX_BIT ;
419
- key .vsh .state = state -> vsh ;
420
- key .vsh .glsl_opts .vulkan = true;
421
- key .vsh .glsl_opts .prefix_outputs = need_geometry_shader ;
422
- key .vsh .glsl_opts .use_push_constants_for_uniform_attrs =
423
- r -> use_push_constants_for_uniform_attrs ;
424
- key .vsh .glsl_opts .ubo_binding = VSH_UBO_BINDING ;
425
- snode -> vsh .module_info = get_and_ref_shader_module_for_key (r , & key );
426
-
427
- memset (& key , 0 , sizeof (key ));
428
- key .kind = VK_SHADER_STAGE_FRAGMENT_BIT ;
429
- key .psh .state = state -> psh ;
430
- key .psh .glsl_opts .vulkan = true;
431
- key .psh .glsl_opts .ubo_binding = PSH_UBO_BINDING ;
432
- key .psh .glsl_opts .tex_binding = PSH_TEX_BINDING ;
433
- snode -> psh .module_info = get_and_ref_shader_module_for_key (r , & key );
434
-
435
- update_shader_uniform_locs (snode );
436
-
437
- snode -> initialized = true;
438
- }
439
-
440
- return snode ;
428
+ ShaderBinding * binding = container_of (node , ShaderBinding , node );
429
+ NV2A_VK_DPRINTF ("shader state hash: %016" PRIx64 " %p" , hash , binding );
430
+ return binding ;
441
431
}
442
432
443
433
static void apply_uniform_updates (ShaderUniformLayout * layout ,
@@ -520,7 +510,7 @@ void pgraph_vk_bind_shaders(PGRAPHState *pg)
520
510
ShaderState new_state = pgraph_glsl_get_shader_state (pg );
521
511
if (!r -> shader_binding || memcmp (& r -> shader_binding -> state , & new_state ,
522
512
sizeof (ShaderState ))) {
523
- r -> shader_binding = gen_shaders ( pg , & new_state );
513
+ r -> shader_binding = get_shader_binding_for_state ( r , & new_state );
524
514
r -> shader_bindings_changed = true;
525
515
}
526
516
} else {
0 commit comments