static GLboolean brwProgramStringNotify(struct gl_context *ctx, GLenum target, struct gl_program *prog) { assert(target == GL_VERTEX_PROGRAM_ARB || !prog->arb.IsPositionInvariant); struct brw_context *brw = brw_context(ctx); const struct brw_compiler *compiler = brw->screen->compiler; switch (target) { case GL_FRAGMENT_PROGRAM_ARB: { struct brw_program *newFP = brw_program(prog); const struct brw_program *curFP = brw_program_const(brw->fragment_program); if (newFP == curFP) brw->ctx.NewDriverState |= BRW_NEW_FRAGMENT_PROGRAM; newFP->id = get_new_program_id(brw->screen); prog->nir = brw_create_nir(brw, NULL, prog, MESA_SHADER_FRAGMENT, true); brw_fs_precompile(ctx, prog); break; } case GL_VERTEX_PROGRAM_ARB: { struct brw_program *newVP = brw_program(prog); const struct brw_program *curVP = brw_program_const(brw->vertex_program); if (newVP == curVP) brw->ctx.NewDriverState |= BRW_NEW_VERTEX_PROGRAM; if (newVP->program.arb.IsPositionInvariant) { _mesa_insert_mvp_code(ctx, &newVP->program); } newVP->id = get_new_program_id(brw->screen); /* Also tell tnl about it: */ _tnl_program_string(ctx, target, prog); prog->nir = brw_create_nir(brw, NULL, prog, MESA_SHADER_VERTEX, compiler->scalar_stage[MESA_SHADER_VERTEX]); brw_vs_precompile(ctx, prog); break; } default: /* * driver->ProgramStringNotify is only called for ARB programs, fixed * function vertex programs, and ir_to_mesa (which isn't used by the * i965 back-end). Therefore, even after geometry shaders are added, * this function should only ever be called with a target of * GL_VERTEX_PROGRAM_ARB or GL_FRAGMENT_PROGRAM_ARB. */ unreachable("Unexpected target in brwProgramStringNotify"); } return true; }
static struct gl_program *brwNewProgram( struct gl_context *ctx, GLenum target, GLuint id ) { struct brw_context *brw = brw_context(ctx); switch (target) { case GL_VERTEX_PROGRAM_ARB: { struct brw_vertex_program *prog = CALLOC_STRUCT(brw_vertex_program); if (prog) { prog->id = get_new_program_id(brw->intelScreen); return _mesa_init_gl_program(&prog->program.Base, target, id); } else return NULL; } case GL_FRAGMENT_PROGRAM_ARB: { struct brw_fragment_program *prog = CALLOC_STRUCT(brw_fragment_program); if (prog) { prog->id = get_new_program_id(brw->intelScreen); return _mesa_init_gl_program(&prog->program.Base, target, id); } else return NULL; } case GL_GEOMETRY_PROGRAM_NV: { struct brw_geometry_program *prog = CALLOC_STRUCT(brw_geometry_program); if (prog) { prog->id = get_new_program_id(brw->intelScreen); return _mesa_init_gl_program(&prog->program.Base, target, id); } else { return NULL; } } case GL_COMPUTE_PROGRAM_NV: { struct brw_compute_program *prog = CALLOC_STRUCT(brw_compute_program); if (prog) { prog->id = get_new_program_id(brw->intelScreen); return _mesa_init_gl_program(&prog->program.Base, target, id); } else { return NULL; } } default: unreachable("Unsupported target in brwNewProgram()"); } }
static struct gl_program *brwNewProgram( struct gl_context *ctx, GLenum target, GLuint id ) { struct brw_context *brw = brw_context(ctx); switch (target) { case GL_VERTEX_PROGRAM_ARB: case GL_TESS_CONTROL_PROGRAM_NV: case GL_TESS_EVALUATION_PROGRAM_NV: case GL_GEOMETRY_PROGRAM_NV: case GL_COMPUTE_PROGRAM_NV: { struct brw_program *prog = rzalloc(NULL, struct brw_program); if (prog) { prog->id = get_new_program_id(brw->screen); return _mesa_init_gl_program(&prog->program, target, id); } else return NULL; } case GL_FRAGMENT_PROGRAM_ARB: { struct brw_program *prog; if (brw->gen < 6) { struct gen4_fragment_program *g4_prog = rzalloc(NULL, struct gen4_fragment_program); prog = &g4_prog->base; } else { prog = rzalloc(NULL, struct brw_program); } if (prog) { prog->id = get_new_program_id(brw->screen); return _mesa_init_gl_program(&prog->program, target, id); } else return NULL; } default: unreachable("Unsupported target in brwNewProgram()"); }