st/mesa/glsl: add new is_arb_asm flag in gl_program
Set the flag via the _mesa_init_gl_program() and NewProgram() helpers. In i965 we currently check for the existance of gl_shader_program to decide if this is an ARB assembly style program or not. Adding a flag makes the code clearer and will help removes a dependency on gl_shader_program in the i965 codegen functions. Also this will allow use to skip initialising sampler units for linked shaders, we currently memset it to zero again during linking. Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
@@ -2202,7 +2202,7 @@ link_intrastage_shaders(void *mem_ctx,
|
|||||||
struct gl_program *gl_prog =
|
struct gl_program *gl_prog =
|
||||||
ctx->Driver.NewProgram(ctx,
|
ctx->Driver.NewProgram(ctx,
|
||||||
_mesa_shader_stage_to_program(shader_list[0]->Stage),
|
_mesa_shader_stage_to_program(shader_list[0]->Stage),
|
||||||
prog->Name);
|
prog->Name, false);
|
||||||
if (!gl_prog) {
|
if (!gl_prog) {
|
||||||
prog->data->LinkStatus = false;
|
prog->data->LinkStatus = false;
|
||||||
_mesa_delete_linked_shader(ctx, linked);
|
_mesa_delete_linked_shader(ctx, linked);
|
||||||
|
@@ -100,12 +100,13 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
init_gl_program(struct gl_program *prog, GLenum target)
|
init_gl_program(struct gl_program *prog, GLenum target, bool is_arb_asm)
|
||||||
{
|
{
|
||||||
mtx_init(&prog->Mutex, mtx_plain);
|
mtx_init(&prog->Mutex, mtx_plain);
|
||||||
|
|
||||||
prog->RefCount = 1;
|
prog->RefCount = 1;
|
||||||
prog->Format = GL_PROGRAM_FORMAT_ASCII_ARB;
|
prog->Format = GL_PROGRAM_FORMAT_ASCII_ARB;
|
||||||
|
prog->is_arb_asm = is_arb_asm;
|
||||||
|
|
||||||
/* default mapping from samplers to texture units */
|
/* default mapping from samplers to texture units */
|
||||||
for (int i = 0; i < MAX_SAMPLERS; i++)
|
for (int i = 0; i < MAX_SAMPLERS; i++)
|
||||||
@@ -113,7 +114,7 @@ init_gl_program(struct gl_program *prog, GLenum target)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct gl_program *
|
struct gl_program *
|
||||||
new_program(struct gl_context *ctx, GLenum target, GLuint id)
|
new_program(struct gl_context *ctx, GLenum target, GLuint id, bool is_arb_asm)
|
||||||
{
|
{
|
||||||
switch (target) {
|
switch (target) {
|
||||||
case GL_VERTEX_PROGRAM_ARB: /* == GL_VERTEX_PROGRAM_NV */
|
case GL_VERTEX_PROGRAM_ARB: /* == GL_VERTEX_PROGRAM_NV */
|
||||||
@@ -123,7 +124,7 @@ new_program(struct gl_context *ctx, GLenum target, GLuint id)
|
|||||||
case GL_FRAGMENT_PROGRAM_ARB:
|
case GL_FRAGMENT_PROGRAM_ARB:
|
||||||
case GL_COMPUTE_PROGRAM_NV: {
|
case GL_COMPUTE_PROGRAM_NV: {
|
||||||
struct gl_program *prog = rzalloc(NULL, struct gl_program);
|
struct gl_program *prog = rzalloc(NULL, struct gl_program);
|
||||||
init_gl_program(prog, target);
|
init_gl_program(prog, target, is_arb_asm);
|
||||||
return prog;
|
return prog;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@@ -1144,12 +1144,13 @@ i915BindProgram(struct gl_context * ctx, GLenum target, struct gl_program *prog)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct gl_program *
|
static struct gl_program *
|
||||||
i915NewProgram(struct gl_context * ctx, GLenum target, GLuint id)
|
i915NewProgram(struct gl_context * ctx, GLenum target, GLuint id,
|
||||||
|
bool is_arb_asm)
|
||||||
{
|
{
|
||||||
switch (target) {
|
switch (target) {
|
||||||
case GL_VERTEX_PROGRAM_ARB: {
|
case GL_VERTEX_PROGRAM_ARB: {
|
||||||
struct gl_program *prog = rzalloc(NULL, struct gl_program);
|
struct gl_program *prog = rzalloc(NULL, struct gl_program);
|
||||||
return _mesa_init_gl_program(prog, target, id);
|
return _mesa_init_gl_program(prog, target, id, is_arb_asm);
|
||||||
}
|
}
|
||||||
|
|
||||||
case GL_FRAGMENT_PROGRAM_ARB:{
|
case GL_FRAGMENT_PROGRAM_ARB:{
|
||||||
@@ -1158,7 +1159,8 @@ i915NewProgram(struct gl_context * ctx, GLenum target, GLuint id)
|
|||||||
if (prog) {
|
if (prog) {
|
||||||
i915_init_program(I915_CONTEXT(ctx), prog);
|
i915_init_program(I915_CONTEXT(ctx), prog);
|
||||||
|
|
||||||
return _mesa_init_gl_program(&prog->FragProg, target, id);
|
return _mesa_init_gl_program(&prog->FragProg, target, id,
|
||||||
|
is_arb_asm);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1167,7 +1169,7 @@ i915NewProgram(struct gl_context * ctx, GLenum target, GLuint id)
|
|||||||
default:
|
default:
|
||||||
/* Just fallback:
|
/* Just fallback:
|
||||||
*/
|
*/
|
||||||
return _mesa_new_program(ctx, target, id);
|
return _mesa_new_program(ctx, target, id, is_arb_asm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -136,9 +136,8 @@ get_new_program_id(struct intel_screen *screen)
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct gl_program *brwNewProgram( struct gl_context *ctx,
|
static struct gl_program *brwNewProgram(struct gl_context *ctx, GLenum target,
|
||||||
GLenum target,
|
GLuint id, bool is_arb_asm)
|
||||||
GLuint id )
|
|
||||||
{
|
{
|
||||||
struct brw_context *brw = brw_context(ctx);
|
struct brw_context *brw = brw_context(ctx);
|
||||||
|
|
||||||
@@ -152,7 +151,7 @@ static struct gl_program *brwNewProgram( struct gl_context *ctx,
|
|||||||
if (prog) {
|
if (prog) {
|
||||||
prog->id = get_new_program_id(brw->screen);
|
prog->id = get_new_program_id(brw->screen);
|
||||||
|
|
||||||
return _mesa_init_gl_program(&prog->program, target, id);
|
return _mesa_init_gl_program(&prog->program, target, id, is_arb_asm);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -171,7 +170,7 @@ static struct gl_program *brwNewProgram( struct gl_context *ctx,
|
|||||||
if (prog) {
|
if (prog) {
|
||||||
prog->id = get_new_program_id(brw->screen);
|
prog->id = get_new_program_id(brw->screen);
|
||||||
|
|
||||||
return _mesa_init_gl_program(&prog->program, target, id);
|
return _mesa_init_gl_program(&prog->program, target, id, is_arb_asm);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@@ -1199,17 +1199,18 @@ r200BindProgram(struct gl_context *ctx, GLenum target, struct gl_program *prog)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct gl_program *
|
static struct gl_program *
|
||||||
r200NewProgram(struct gl_context *ctx, GLenum target, GLuint id)
|
r200NewProgram(struct gl_context *ctx, GLenum target, GLuint id,
|
||||||
|
bool is_arb_asm)
|
||||||
{
|
{
|
||||||
switch(target){
|
switch(target){
|
||||||
case GL_VERTEX_PROGRAM_ARB: {
|
case GL_VERTEX_PROGRAM_ARB: {
|
||||||
struct r200_vertex_program *vp = rzalloc(NULL,
|
struct r200_vertex_program *vp = rzalloc(NULL,
|
||||||
struct r200_vertex_program);
|
struct r200_vertex_program);
|
||||||
return _mesa_init_gl_program(&vp->mesa_program, target, id);
|
return _mesa_init_gl_program(&vp->mesa_program, target, id, is_arb_asm);
|
||||||
}
|
}
|
||||||
case GL_FRAGMENT_PROGRAM_ARB: {
|
case GL_FRAGMENT_PROGRAM_ARB: {
|
||||||
struct gl_program *prog = rzalloc(NULL, struct gl_program);
|
struct gl_program *prog = rzalloc(NULL, struct gl_program);
|
||||||
return _mesa_init_gl_program(prog, target, id);
|
return _mesa_init_gl_program(prog, target, id, is_arb_asm);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
_mesa_problem(ctx, "Bad target in r200NewProgram");
|
_mesa_problem(ctx, "Bad target in r200NewProgram");
|
||||||
|
@@ -83,7 +83,7 @@ _mesa_BindProgramARB(GLenum target, GLuint id)
|
|||||||
newProg = _mesa_lookup_program(ctx, id);
|
newProg = _mesa_lookup_program(ctx, id);
|
||||||
if (!newProg || newProg == &_mesa_DummyProgram) {
|
if (!newProg || newProg == &_mesa_DummyProgram) {
|
||||||
/* allocate a new program now */
|
/* allocate a new program now */
|
||||||
newProg = ctx->Driver.NewProgram(ctx, target, id);
|
newProg = ctx->Driver.NewProgram(ctx, target, id, true);
|
||||||
if (!newProg) {
|
if (!newProg) {
|
||||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindProgramARB");
|
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindProgramARB");
|
||||||
return;
|
return;
|
||||||
|
@@ -474,7 +474,7 @@ struct dd_function_table {
|
|||||||
struct gl_program *prog);
|
struct gl_program *prog);
|
||||||
/** Allocate a new program */
|
/** Allocate a new program */
|
||||||
struct gl_program * (*NewProgram)(struct gl_context *ctx, GLenum target,
|
struct gl_program * (*NewProgram)(struct gl_context *ctx, GLenum target,
|
||||||
GLuint id);
|
GLuint id, bool is_arb_asm);
|
||||||
/** Delete a program */
|
/** Delete a program */
|
||||||
void (*DeleteProgram)(struct gl_context *ctx, struct gl_program *prog);
|
void (*DeleteProgram)(struct gl_context *ctx, struct gl_program *prog);
|
||||||
/**
|
/**
|
||||||
|
@@ -1671,7 +1671,7 @@ _mesa_get_fixed_func_vertex_program(struct gl_context *ctx)
|
|||||||
if (0)
|
if (0)
|
||||||
printf("Build new TNL program\n");
|
printf("Build new TNL program\n");
|
||||||
|
|
||||||
prog = ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0);
|
prog = ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0, true);
|
||||||
if (!prog)
|
if (!prog)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
@@ -1925,6 +1925,8 @@ struct gl_program
|
|||||||
|
|
||||||
struct nir_shader *nir;
|
struct nir_shader *nir;
|
||||||
|
|
||||||
|
bool is_arb_asm; /** Is this an ARB assembly-style program */
|
||||||
|
|
||||||
GLbitfield64 SecondaryOutputsWritten; /**< Subset of OutputsWritten outputs written with non-zero index. */
|
GLbitfield64 SecondaryOutputsWritten; /**< Subset of OutputsWritten outputs written with non-zero index. */
|
||||||
GLbitfield TexturesUsed[MAX_COMBINED_TEXTURE_IMAGE_UNITS]; /**< TEXTURE_x_BIT bitmask */
|
GLbitfield TexturesUsed[MAX_COMBINED_TEXTURE_IMAGE_UNITS]; /**< TEXTURE_x_BIT bitmask */
|
||||||
GLbitfield SamplersUsed; /**< Bitfield of which samplers are used */
|
GLbitfield SamplersUsed; /**< Bitfield of which samplers are used */
|
||||||
|
@@ -70,9 +70,9 @@ _mesa_alloc_shared_state(struct gl_context *ctx)
|
|||||||
shared->Programs = _mesa_NewHashTable();
|
shared->Programs = _mesa_NewHashTable();
|
||||||
|
|
||||||
shared->DefaultVertexProgram =
|
shared->DefaultVertexProgram =
|
||||||
ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0);
|
ctx->Driver.NewProgram(ctx, GL_VERTEX_PROGRAM_ARB, 0, true);
|
||||||
shared->DefaultFragmentProgram =
|
shared->DefaultFragmentProgram =
|
||||||
ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0);
|
ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0, true);
|
||||||
|
|
||||||
shared->ATIShaders = _mesa_NewHashTable();
|
shared->ATIShaders = _mesa_NewHashTable();
|
||||||
shared->DefaultFragmentShader = _mesa_new_ati_fragment_shader(ctx, 0);
|
shared->DefaultFragmentShader = _mesa_new_ati_fragment_shader(ctx, 0);
|
||||||
|
@@ -178,7 +178,8 @@ _mesa_set_program_error(struct gl_context *ctx, GLint pos, const char *string)
|
|||||||
* Initialize a new gl_program object.
|
* Initialize a new gl_program object.
|
||||||
*/
|
*/
|
||||||
struct gl_program *
|
struct gl_program *
|
||||||
_mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id)
|
_mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id,
|
||||||
|
bool is_arb_asm)
|
||||||
{
|
{
|
||||||
GLuint i;
|
GLuint i;
|
||||||
|
|
||||||
@@ -192,6 +193,7 @@ _mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id)
|
|||||||
prog->RefCount = 1;
|
prog->RefCount = 1;
|
||||||
prog->Format = GL_PROGRAM_FORMAT_ASCII_ARB;
|
prog->Format = GL_PROGRAM_FORMAT_ASCII_ARB;
|
||||||
prog->info.stage = _mesa_program_enum_to_shader_stage(target);
|
prog->info.stage = _mesa_program_enum_to_shader_stage(target);
|
||||||
|
prog->is_arb_asm = is_arb_asm;
|
||||||
|
|
||||||
/* default mapping from samplers to texture units */
|
/* default mapping from samplers to texture units */
|
||||||
for (i = 0; i < MAX_SAMPLERS; i++)
|
for (i = 0; i < MAX_SAMPLERS; i++)
|
||||||
@@ -214,7 +216,8 @@ _mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id)
|
|||||||
* \return pointer to new program object
|
* \return pointer to new program object
|
||||||
*/
|
*/
|
||||||
struct gl_program *
|
struct gl_program *
|
||||||
_mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id)
|
_mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id,
|
||||||
|
bool is_arb_asm)
|
||||||
{
|
{
|
||||||
switch (target) {
|
switch (target) {
|
||||||
case GL_VERTEX_PROGRAM_ARB: /* == GL_VERTEX_PROGRAM_NV */
|
case GL_VERTEX_PROGRAM_ARB: /* == GL_VERTEX_PROGRAM_NV */
|
||||||
@@ -224,7 +227,7 @@ _mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id)
|
|||||||
case GL_FRAGMENT_PROGRAM_ARB:
|
case GL_FRAGMENT_PROGRAM_ARB:
|
||||||
case GL_COMPUTE_PROGRAM_NV: {
|
case GL_COMPUTE_PROGRAM_NV: {
|
||||||
struct gl_program *prog = rzalloc(NULL, struct gl_program);
|
struct gl_program *prog = rzalloc(NULL, struct gl_program);
|
||||||
return _mesa_init_gl_program(prog, target, id);
|
return _mesa_init_gl_program(prog, target, id, is_arb_asm);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
_mesa_problem(ctx, "bad target in _mesa_new_program");
|
_mesa_problem(ctx, "bad target in _mesa_new_program");
|
||||||
|
@@ -64,10 +64,12 @@ extern void
|
|||||||
_mesa_set_program_error(struct gl_context *ctx, GLint pos, const char *string);
|
_mesa_set_program_error(struct gl_context *ctx, GLint pos, const char *string);
|
||||||
|
|
||||||
extern struct gl_program *
|
extern struct gl_program *
|
||||||
_mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id);
|
_mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id,
|
||||||
|
bool is_arb_asm);
|
||||||
|
|
||||||
extern struct gl_program *
|
extern struct gl_program *
|
||||||
_mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id);
|
_mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id,
|
||||||
|
bool is_arb_asm);
|
||||||
|
|
||||||
extern void
|
extern void
|
||||||
_mesa_delete_program(struct gl_context *ctx, struct gl_program *prog);
|
_mesa_delete_program(struct gl_context *ctx, struct gl_program *prog);
|
||||||
|
@@ -54,38 +54,39 @@
|
|||||||
* fragment program.
|
* fragment program.
|
||||||
*/
|
*/
|
||||||
static struct gl_program *
|
static struct gl_program *
|
||||||
st_new_program(struct gl_context *ctx, GLenum target, GLuint id)
|
st_new_program(struct gl_context *ctx, GLenum target, GLuint id,
|
||||||
|
bool is_arb_asm)
|
||||||
{
|
{
|
||||||
switch (target) {
|
switch (target) {
|
||||||
case GL_VERTEX_PROGRAM_ARB: {
|
case GL_VERTEX_PROGRAM_ARB: {
|
||||||
struct st_vertex_program *prog = rzalloc(NULL,
|
struct st_vertex_program *prog = rzalloc(NULL,
|
||||||
struct st_vertex_program);
|
struct st_vertex_program);
|
||||||
return _mesa_init_gl_program(&prog->Base, target, id);
|
return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm);
|
||||||
}
|
}
|
||||||
case GL_FRAGMENT_PROGRAM_ARB: {
|
case GL_FRAGMENT_PROGRAM_ARB: {
|
||||||
struct st_fragment_program *prog = rzalloc(NULL,
|
struct st_fragment_program *prog = rzalloc(NULL,
|
||||||
struct st_fragment_program);
|
struct st_fragment_program);
|
||||||
return _mesa_init_gl_program(&prog->Base, target, id);
|
return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm);
|
||||||
}
|
}
|
||||||
case GL_GEOMETRY_PROGRAM_NV: {
|
case GL_GEOMETRY_PROGRAM_NV: {
|
||||||
struct st_geometry_program *prog = rzalloc(NULL,
|
struct st_geometry_program *prog = rzalloc(NULL,
|
||||||
struct st_geometry_program);
|
struct st_geometry_program);
|
||||||
return _mesa_init_gl_program(&prog->Base, target, id);
|
return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm);
|
||||||
}
|
}
|
||||||
case GL_TESS_CONTROL_PROGRAM_NV: {
|
case GL_TESS_CONTROL_PROGRAM_NV: {
|
||||||
struct st_tessctrl_program *prog = rzalloc(NULL,
|
struct st_tessctrl_program *prog = rzalloc(NULL,
|
||||||
struct st_tessctrl_program);
|
struct st_tessctrl_program);
|
||||||
return _mesa_init_gl_program(&prog->Base, target, id);
|
return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm);
|
||||||
}
|
}
|
||||||
case GL_TESS_EVALUATION_PROGRAM_NV: {
|
case GL_TESS_EVALUATION_PROGRAM_NV: {
|
||||||
struct st_tesseval_program *prog = rzalloc(NULL,
|
struct st_tesseval_program *prog = rzalloc(NULL,
|
||||||
struct st_tesseval_program);
|
struct st_tesseval_program);
|
||||||
return _mesa_init_gl_program(&prog->Base, target, id);
|
return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm);
|
||||||
}
|
}
|
||||||
case GL_COMPUTE_PROGRAM_NV: {
|
case GL_COMPUTE_PROGRAM_NV: {
|
||||||
struct st_compute_program *prog = rzalloc(NULL,
|
struct st_compute_program *prog = rzalloc(NULL,
|
||||||
struct st_compute_program);
|
struct st_compute_program);
|
||||||
return _mesa_init_gl_program(&prog->Base, target, id);
|
return _mesa_init_gl_program(&prog->Base, target, id, is_arb_asm);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
@@ -290,7 +291,7 @@ static struct gl_program *
|
|||||||
st_new_ati_fs(struct gl_context *ctx, struct ati_fragment_shader *curProg)
|
st_new_ati_fs(struct gl_context *ctx, struct ati_fragment_shader *curProg)
|
||||||
{
|
{
|
||||||
struct gl_program *prog = ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB,
|
struct gl_program *prog = ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB,
|
||||||
curProg->Id);
|
curProg->Id, true);
|
||||||
struct st_fragment_program *stfp = (struct st_fragment_program *)prog;
|
struct st_fragment_program *stfp = (struct st_fragment_program *)prog;
|
||||||
stfp->ati_fs = curProg;
|
stfp->ati_fs = curProg;
|
||||||
return prog;
|
return prog;
|
||||||
|
Reference in New Issue
Block a user