bool brw_vs_precompile(struct gl_context *ctx, struct gl_shader_program *prog) { struct brw_context *brw = brw_context(ctx); struct brw_vs_prog_key key; if (!prog->_LinkedShaders[MESA_SHADER_VERTEX]) return true; struct gl_vertex_program *vp = (struct gl_vertex_program *) prog->_LinkedShaders[MESA_SHADER_VERTEX]->Program; struct brw_vertex_program *bvp = brw_vertex_program(vp); memset(&key, 0, sizeof(key)); brw_vec4_setup_prog_key_for_precompile(ctx, &key.base, bvp->id, &vp->Base); // In VK, user clipping is triggered solely from the shader. key.base.userclip_active = vp->Base.UsesClipDistanceOut; struct brw_vs_compile c; brw_vs_init_compile(brw, prog, bvp, &key, &c); if (!brw_vs_do_compile(brw, &c)) { brw_vs_clear_compile(brw, &c); return false; } // Rather than defer or upload to cache, hand off // the compile results back to the brw_context brw_shader_program_save_vs_compile(brw->shader_prog, &c); return true; }
bool brw_gs_precompile(struct gl_context *ctx, struct gl_shader_program *prog) { struct brw_context *brw = brw_context(ctx); struct brw_gs_prog_key key; uint32_t old_prog_offset = brw->gs.base.prog_offset; struct brw_gs_prog_data *old_prog_data = brw->gs.prog_data; bool success; if (!prog->_LinkedShaders[MESA_SHADER_GEOMETRY]) return true; struct gl_geometry_program *gp = (struct gl_geometry_program *) prog->_LinkedShaders[MESA_SHADER_GEOMETRY]->Program; struct brw_geometry_program *bgp = brw_geometry_program(gp); memset(&key, 0, sizeof(key)); brw_vec4_setup_prog_key_for_precompile(ctx, &key.base, bgp->id, &gp->Base); /* Assume that the set of varyings coming in from the vertex shader exactly * matches what the geometry shader requires. */ key.input_varyings = gp->Base.InputsRead; success = do_gs_prog(brw, prog, bgp, &key); brw->gs.base.prog_offset = old_prog_offset; brw->gs.prog_data = old_prog_data; return success; }
bool brw_vs_precompile(struct gl_context *ctx, struct gl_shader_program *prog) { struct brw_context *brw = brw_context(ctx); struct brw_vs_prog_key key; uint32_t old_prog_offset = brw->vs.base.prog_offset; struct brw_vs_prog_data *old_prog_data = brw->vs.prog_data; bool success; if (!prog->_LinkedShaders[MESA_SHADER_VERTEX]) return true; struct gl_vertex_program *vp = (struct gl_vertex_program *) prog->_LinkedShaders[MESA_SHADER_VERTEX]->Program; struct brw_vertex_program *bvp = brw_vertex_program(vp); memset(&key, 0, sizeof(key)); brw_vec4_setup_prog_key_for_precompile(ctx, &key.base, bvp->id, &vp->Base); success = do_vs_prog(brw, prog, bvp, &key); brw->vs.base.prog_offset = old_prog_offset; brw->vs.prog_data = old_prog_data; return success; }