X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fprogram%2Fprogram.c;h=e9a2c96bee551a6e2974f2d7b5d9e50ea235451b;hb=HEAD;hp=b5533c725793892f72f531c05cbbb996b1fd934f;hpb=9e756de7d19307044c9b4a08b285836fbe128589;p=mesa.git diff --git a/src/mesa/program/program.c b/src/mesa/program/program.c index b5533c72579..e9a2c96bee5 100644 --- a/src/mesa/program/program.c +++ b/src/mesa/program/program.c @@ -39,6 +39,7 @@ #include "prog_cache.h" #include "prog_parameter.h" #include "prog_instruction.h" +#include "util/bitscan.h" #include "util/ralloc.h" #include "util/u_atomic.h" @@ -99,6 +100,7 @@ _mesa_init_program(struct gl_context *ctx) ctx->Shared->DefaultFragmentProgram); assert(ctx->FragmentProgram.Current); ctx->FragmentProgram.Cache = _mesa_new_program_cache(); + ctx->VertexProgram._VPMode = VP_MODE_FF; /* XXX probably move this stuff */ ctx->ATIFragmentShader.Enabled = GL_FALSE; @@ -179,18 +181,18 @@ _mesa_set_program_error(struct gl_context *ctx, GLint pos, const char *string) * Initialize a new gl_program object. */ struct gl_program * -_mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id, - bool is_arb_asm) +_mesa_init_gl_program(struct gl_program *prog, gl_shader_stage stage, + GLuint id, bool is_arb_asm) { if (!prog) return NULL; memset(prog, 0, sizeof(*prog)); prog->Id = id; - prog->Target = target; + prog->Target = _mesa_shader_stage_to_program(stage); prog->RefCount = 1; prog->Format = GL_PROGRAM_FORMAT_ASCII_ARB; - prog->info.stage = _mesa_program_enum_to_shader_stage(target); + prog->info.stage = stage; prog->is_arb_asm = is_arb_asm; /* Uniforms that lack an initializer in the shader code have an initial @@ -223,27 +225,16 @@ _mesa_init_gl_program(struct gl_program *prog, GLenum target, GLuint id, * * \param ctx context * \param id program id/number - * \param target program target/type + * \param stage shader stage * \return pointer to new program object */ struct gl_program * -_mesa_new_program(struct gl_context *ctx, GLenum target, GLuint id, +_mesa_new_program(struct gl_context *ctx, gl_shader_stage stage, GLuint id, bool is_arb_asm) { - switch (target) { - case GL_VERTEX_PROGRAM_ARB: /* == GL_VERTEX_PROGRAM_NV */ - case GL_GEOMETRY_PROGRAM_NV: - case GL_TESS_CONTROL_PROGRAM_NV: - case GL_TESS_EVALUATION_PROGRAM_NV: - case GL_FRAGMENT_PROGRAM_ARB: - case GL_COMPUTE_PROGRAM_NV: { - struct gl_program *prog = rzalloc(NULL, struct gl_program); - return _mesa_init_gl_program(prog, target, id, is_arb_asm); - } - default: - _mesa_problem(ctx, "bad target in _mesa_new_program"); - return NULL; - } + struct gl_program *prog = rzalloc(NULL, struct gl_program); + + return _mesa_init_gl_program(prog, stage, id, is_arb_asm); } @@ -275,6 +266,14 @@ _mesa_delete_program(struct gl_context *ctx, struct gl_program *prog) ralloc_free(prog->sh.BindlessSamplers); } + if (prog->sh.BindlessImages) { + ralloc_free(prog->sh.BindlessImages); + } + + if (prog->driver_cache_blob) { + ralloc_free(prog->driver_cache_blob); + } + ralloc_free(prog); } @@ -506,8 +505,7 @@ _mesa_find_free_register(const GLboolean used[], */ GLint _mesa_get_min_invocations_per_fragment(struct gl_context *ctx, - const struct gl_program *prog, - bool ignore_sample_qualifier) + const struct gl_program *prog) { /* From ARB_sample_shading specification: * "Using gl_SampleID in a fragment shader causes the entire shader @@ -525,17 +523,31 @@ _mesa_get_min_invocations_per_fragment(struct gl_context *ctx, * "Use of the "sample" qualifier on a fragment shader input * forces per-sample shading" */ - if (prog->info.fs.uses_sample_qualifier && !ignore_sample_qualifier) - return MAX2(_mesa_geometric_samples(ctx->DrawBuffer), 1); - - if (prog->info.system_values_read & (SYSTEM_BIT_SAMPLE_ID | - SYSTEM_BIT_SAMPLE_POS)) + if (prog->info.fs.uses_sample_qualifier || + (prog->info.system_values_read & (SYSTEM_BIT_SAMPLE_ID | + SYSTEM_BIT_SAMPLE_POS))) return MAX2(_mesa_geometric_samples(ctx->DrawBuffer), 1); else if (ctx->Multisample.SampleShading) - return MAX2(ceil(ctx->Multisample.MinSampleShadingValue * + return MAX2(ceilf(ctx->Multisample.MinSampleShadingValue * _mesa_geometric_samples(ctx->DrawBuffer)), 1); else return 1; } return 1; } + + +GLbitfield +gl_external_samplers(const struct gl_program *prog) +{ + GLbitfield external_samplers = 0; + GLbitfield mask = prog->SamplersUsed; + + while (mask) { + int idx = u_bit_scan(&mask); + if (prog->sh.SamplerTargets[idx] == TEXTURE_EXTERNAL_INDEX) + external_samplers |= (1 << idx); + } + + return external_samplers; +}