Skip to content

Commit da7160f

Browse files
committed
nv2a/vk: Initialize ShaderBinding in shader_cache_entry_init
1 parent 27f7525 commit da7160f

File tree

2 files changed

+56
-68
lines changed

2 files changed

+56
-68
lines changed

hw/xbox/nv2a/pgraph/vk/renderer.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,6 @@ typedef struct ShaderModuleCacheEntry {
182182

183183
typedef struct ShaderBinding {
184184
LruNode node;
185-
bool initialized;
186-
187185
ShaderState state;
188186
struct {
189187
ShaderModuleInfo *module_info;

hw/xbox/nv2a/pgraph/vk/shaders.c

Lines changed: 56 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -248,11 +248,58 @@ static void update_shader_uniform_locs(ShaderBinding *binding)
248248
}
249249
}
250250

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+
251262
static void shader_cache_entry_init(Lru *lru, LruNode *node, void *state)
252263
{
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);
256303
}
257304

258305
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)
270317
pgraph_vk_unref_shader_module(r, modules[i]);
271318
}
272319
}
273-
274-
snode->initialized = false;
275320
}
276321

277322
static bool shader_cache_entry_compare(Lru *lru, LruNode *node, void *key)
@@ -375,69 +420,14 @@ static void shader_cache_finalize(PGRAPHState *pg)
375420
r->shader_module_cache_entries = NULL;
376421
}
377422

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)
390425
{
391-
PGRAPHVkState *r = pg->vk_renderer_state;
392-
393426
uint64_t hash = fast_hash((void *)state, sizeof(*state));
394427
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;
441431
}
442432

443433
static void apply_uniform_updates(ShaderUniformLayout *layout,
@@ -520,7 +510,7 @@ void pgraph_vk_bind_shaders(PGRAPHState *pg)
520510
ShaderState new_state = pgraph_glsl_get_shader_state(pg);
521511
if (!r->shader_binding || memcmp(&r->shader_binding->state, &new_state,
522512
sizeof(ShaderState))) {
523-
r->shader_binding = gen_shaders(pg, &new_state);
513+
r->shader_binding = get_shader_binding_for_state(r, &new_state);
524514
r->shader_bindings_changed = true;
525515
}
526516
} else {

0 commit comments

Comments
 (0)