Added few more stubs so that control reaches to DestroyDevice().
[mesa.git] / src / mesa / program / program.c
index 0defa012aee9f1680c3d6e853fb387f758d58fb0..e9a2c96bee551a6e2974f2d7b5d9e50ea235451b 100644 (file)
@@ -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);
 }
 
 
@@ -279,6 +270,10 @@ _mesa_delete_program(struct gl_context *ctx, struct gl_program *prog)
       ralloc_free(prog->sh.BindlessImages);
    }
 
+   if (prog->driver_cache_blob) {
+      ralloc_free(prog->driver_cache_blob);
+   }
+
    ralloc_free(prog);
 }
 
@@ -510,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
@@ -529,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;
+}