[Mesa-dev] st/mesa. fix crash when glBlitFramebuffer is the first function called

Submitted by Marek Olšák on June 26, 2015, 9:01 a.m.

Details

Message ID 1435309279-4454-1-git-send-email-maraeo@gmail.com
State New
Headers show

Not browsing as part of any series.

Commit Message

Marek Olšák June 26, 2015, 9:01 a.m.
From: Marek Olšák <marek.olsak@amd.com>

No states are initialized at that point yet.

Cc: 10.5 10.6 <mesa-stable@lists.freedesktop.org>
---
 src/mesa/state_tracker/st_atom_constbuf.c | 14 ++++++++------
 src/mesa/state_tracker/st_atom_sampler.c  | 30 +++++++++++++++++-------------
 src/mesa/state_tracker/st_atom_shader.c   |  8 ++++++--
 src/mesa/state_tracker/st_atom_texture.c  | 19 +++++++++++--------
 4 files changed, 42 insertions(+), 29 deletions(-)

Patch hide | download patch | download mbox

diff --git a/src/mesa/state_tracker/st_atom_constbuf.c b/src/mesa/state_tracker/st_atom_constbuf.c
index a54e0d9..a31765c 100644
--- a/src/mesa/state_tracker/st_atom_constbuf.c
+++ b/src/mesa/state_tracker/st_atom_constbuf.c
@@ -117,10 +117,11 @@  void st_upload_constants( struct st_context *st,
  */
 static void update_vs_constants(struct st_context *st )
 {
-   struct st_vertex_program *vp = st->vp;
-   struct gl_program_parameter_list *params = vp->Base.Base.Parameters;
+   if (st->vp) {
+      struct gl_program_parameter_list *params = st->vp->Base.Base.Parameters;
 
-   st_upload_constants( st, params, PIPE_SHADER_VERTEX );
+      st_upload_constants(st, params, PIPE_SHADER_VERTEX);
+   }
 }
 
 
@@ -140,10 +141,11 @@  const struct st_tracked_state st_update_vs_constants = {
  */
 static void update_fs_constants(struct st_context *st )
 {
-   struct st_fragment_program *fp = st->fp;
-   struct gl_program_parameter_list *params = fp->Base.Base.Parameters;
+   if (st->fp) {
+      struct gl_program_parameter_list *params = st->fp->Base.Base.Parameters;
 
-   st_upload_constants( st, params, PIPE_SHADER_FRAGMENT );
+      st_upload_constants(st, params, PIPE_SHADER_FRAGMENT);
+   }
 }
 
 
diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
index b68eb16..96ba3f4 100644
--- a/src/mesa/state_tracker/st_atom_sampler.c
+++ b/src/mesa/state_tracker/st_atom_sampler.c
@@ -284,19 +284,23 @@  update_samplers(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
-   update_shader_samplers(st,
-                          PIPE_SHADER_FRAGMENT,
-                          &ctx->FragmentProgram._Current->Base,
-                          ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
-                          st->state.samplers[PIPE_SHADER_FRAGMENT],
-                          &st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
-
-   update_shader_samplers(st,
-                          PIPE_SHADER_VERTEX,
-                          &ctx->VertexProgram._Current->Base,
-                          ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits,
-                          st->state.samplers[PIPE_SHADER_VERTEX],
-                          &st->state.num_samplers[PIPE_SHADER_VERTEX]);
+   if (ctx->FragmentProgram._Current) {
+      update_shader_samplers(st,
+                             PIPE_SHADER_FRAGMENT,
+                             &ctx->FragmentProgram._Current->Base,
+                             ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
+                             st->state.samplers[PIPE_SHADER_FRAGMENT],
+                             &st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
+   }
+
+   if (ctx->VertexProgram._Current) {
+      update_shader_samplers(st,
+                             PIPE_SHADER_VERTEX,
+                             &ctx->VertexProgram._Current->Base,
+                             ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits,
+                             st->state.samplers[PIPE_SHADER_VERTEX],
+                             &st->state.num_samplers[PIPE_SHADER_VERTEX]);
+   }
 
    if (ctx->GeometryProgram._Current) {
       update_shader_samplers(st,
diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c
index ad8d262..9ce71b2 100644
--- a/src/mesa/state_tracker/st_atom_shader.c
+++ b/src/mesa/state_tracker/st_atom_shader.c
@@ -77,7 +77,9 @@  update_fp( struct st_context *st )
    struct st_fragment_program *stfp;
    struct st_fp_variant_key key;
 
-   assert(st->ctx->FragmentProgram._Current);
+   if (!st->ctx->FragmentProgram._Current)
+      return;
+
    stfp = st_fragment_program(st->ctx->FragmentProgram._Current);
    assert(stfp->Base.Base.Target == GL_FRAGMENT_PROGRAM_ARB);
 
@@ -132,7 +134,9 @@  update_vp( struct st_context *st )
    /* find active shader and params -- Should be covered by
     * ST_NEW_VERTEX_PROGRAM
     */
-   assert(st->ctx->VertexProgram._Current);
+   if (!st->ctx->VertexProgram._Current)
+      return;
+
    stvp = st_vertex_program(st->ctx->VertexProgram._Current);
    assert(stvp->Base.Base.Target == GL_VERTEX_PROGRAM_ARB);
 
diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
index 04ba864..bcdeaa5 100644
--- a/src/mesa/state_tracker/st_atom_texture.c
+++ b/src/mesa/state_tracker/st_atom_texture.c
@@ -433,7 +433,8 @@  update_vertex_textures(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
-   if (ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) {
+   if (ctx->VertexProgram._Current &&
+       ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) {
       update_textures(st,
                       PIPE_SHADER_VERTEX,
                       &ctx->VertexProgram._Current->Base,
@@ -449,12 +450,14 @@  update_fragment_textures(struct st_context *st)
 {
    const struct gl_context *ctx = st->ctx;
 
-   update_textures(st,
-                   PIPE_SHADER_FRAGMENT,
-                   &ctx->FragmentProgram._Current->Base,
-                   ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
-                   st->state.sampler_views[PIPE_SHADER_FRAGMENT],
-                   &st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
+   if (ctx->FragmentProgram._Current) {
+      update_textures(st,
+                      PIPE_SHADER_FRAGMENT,
+                      &ctx->FragmentProgram._Current->Base,
+                      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
+                      st->state.sampler_views[PIPE_SHADER_FRAGMENT],
+                      &st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
+   }
 }
 
 
@@ -516,7 +519,7 @@  finalize_textures(struct st_context *st)
    st->missing_textures = GL_FALSE;
 
    for (su = 0; su < ctx->Const.MaxTextureCoordUnits; su++) {
-      if (fprog->Base.SamplersUsed & (1 << su)) {
+      if (fprog && fprog->Base.SamplersUsed & (1 << su)) {
          const GLuint texUnit = fprog->Base.SamplerUnits[su];
          struct gl_texture_object *texObj
             = ctx->Texture.Unit[texUnit]._Current;

Comments

Ping

On Fri, Jun 26, 2015 at 11:01 AM, Marek Olšák <maraeo@gmail.com> wrote:
> From: Marek Olšák <marek.olsak@amd.com>
>
> No states are initialized at that point yet.
>
> Cc: 10.5 10.6 <mesa-stable@lists.freedesktop.org>
> ---
>  src/mesa/state_tracker/st_atom_constbuf.c | 14 ++++++++------
>  src/mesa/state_tracker/st_atom_sampler.c  | 30 +++++++++++++++++-------------
>  src/mesa/state_tracker/st_atom_shader.c   |  8 ++++++--
>  src/mesa/state_tracker/st_atom_texture.c  | 19 +++++++++++--------
>  4 files changed, 42 insertions(+), 29 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_atom_constbuf.c b/src/mesa/state_tracker/st_atom_constbuf.c
> index a54e0d9..a31765c 100644
> --- a/src/mesa/state_tracker/st_atom_constbuf.c
> +++ b/src/mesa/state_tracker/st_atom_constbuf.c
> @@ -117,10 +117,11 @@ void st_upload_constants( struct st_context *st,
>   */
>  static void update_vs_constants(struct st_context *st )
>  {
> -   struct st_vertex_program *vp = st->vp;
> -   struct gl_program_parameter_list *params = vp->Base.Base.Parameters;
> +   if (st->vp) {
> +      struct gl_program_parameter_list *params = st->vp->Base.Base.Parameters;
>
> -   st_upload_constants( st, params, PIPE_SHADER_VERTEX );
> +      st_upload_constants(st, params, PIPE_SHADER_VERTEX);
> +   }
>  }
>
>
> @@ -140,10 +141,11 @@ const struct st_tracked_state st_update_vs_constants = {
>   */
>  static void update_fs_constants(struct st_context *st )
>  {
> -   struct st_fragment_program *fp = st->fp;
> -   struct gl_program_parameter_list *params = fp->Base.Base.Parameters;
> +   if (st->fp) {
> +      struct gl_program_parameter_list *params = st->fp->Base.Base.Parameters;
>
> -   st_upload_constants( st, params, PIPE_SHADER_FRAGMENT );
> +      st_upload_constants(st, params, PIPE_SHADER_FRAGMENT);
> +   }
>  }
>
>
> diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
> index b68eb16..96ba3f4 100644
> --- a/src/mesa/state_tracker/st_atom_sampler.c
> +++ b/src/mesa/state_tracker/st_atom_sampler.c
> @@ -284,19 +284,23 @@ update_samplers(struct st_context *st)
>  {
>     const struct gl_context *ctx = st->ctx;
>
> -   update_shader_samplers(st,
> -                          PIPE_SHADER_FRAGMENT,
> -                          &ctx->FragmentProgram._Current->Base,
> -                          ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
> -                          st->state.samplers[PIPE_SHADER_FRAGMENT],
> -                          &st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
> -
> -   update_shader_samplers(st,
> -                          PIPE_SHADER_VERTEX,
> -                          &ctx->VertexProgram._Current->Base,
> -                          ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits,
> -                          st->state.samplers[PIPE_SHADER_VERTEX],
> -                          &st->state.num_samplers[PIPE_SHADER_VERTEX]);
> +   if (ctx->FragmentProgram._Current) {
> +      update_shader_samplers(st,
> +                             PIPE_SHADER_FRAGMENT,
> +                             &ctx->FragmentProgram._Current->Base,
> +                             ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
> +                             st->state.samplers[PIPE_SHADER_FRAGMENT],
> +                             &st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
> +   }
> +
> +   if (ctx->VertexProgram._Current) {
> +      update_shader_samplers(st,
> +                             PIPE_SHADER_VERTEX,
> +                             &ctx->VertexProgram._Current->Base,
> +                             ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits,
> +                             st->state.samplers[PIPE_SHADER_VERTEX],
> +                             &st->state.num_samplers[PIPE_SHADER_VERTEX]);
> +   }
>
>     if (ctx->GeometryProgram._Current) {
>        update_shader_samplers(st,
> diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c
> index ad8d262..9ce71b2 100644
> --- a/src/mesa/state_tracker/st_atom_shader.c
> +++ b/src/mesa/state_tracker/st_atom_shader.c
> @@ -77,7 +77,9 @@ update_fp( struct st_context *st )
>     struct st_fragment_program *stfp;
>     struct st_fp_variant_key key;
>
> -   assert(st->ctx->FragmentProgram._Current);
> +   if (!st->ctx->FragmentProgram._Current)
> +      return;
> +
>     stfp = st_fragment_program(st->ctx->FragmentProgram._Current);
>     assert(stfp->Base.Base.Target == GL_FRAGMENT_PROGRAM_ARB);
>
> @@ -132,7 +134,9 @@ update_vp( struct st_context *st )
>     /* find active shader and params -- Should be covered by
>      * ST_NEW_VERTEX_PROGRAM
>      */
> -   assert(st->ctx->VertexProgram._Current);
> +   if (!st->ctx->VertexProgram._Current)
> +      return;
> +
>     stvp = st_vertex_program(st->ctx->VertexProgram._Current);
>     assert(stvp->Base.Base.Target == GL_VERTEX_PROGRAM_ARB);
>
> diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
> index 04ba864..bcdeaa5 100644
> --- a/src/mesa/state_tracker/st_atom_texture.c
> +++ b/src/mesa/state_tracker/st_atom_texture.c
> @@ -433,7 +433,8 @@ update_vertex_textures(struct st_context *st)
>  {
>     const struct gl_context *ctx = st->ctx;
>
> -   if (ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) {
> +   if (ctx->VertexProgram._Current &&
> +       ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) {
>        update_textures(st,
>                        PIPE_SHADER_VERTEX,
>                        &ctx->VertexProgram._Current->Base,
> @@ -449,12 +450,14 @@ update_fragment_textures(struct st_context *st)
>  {
>     const struct gl_context *ctx = st->ctx;
>
> -   update_textures(st,
> -                   PIPE_SHADER_FRAGMENT,
> -                   &ctx->FragmentProgram._Current->Base,
> -                   ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
> -                   st->state.sampler_views[PIPE_SHADER_FRAGMENT],
> -                   &st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
> +   if (ctx->FragmentProgram._Current) {
> +      update_textures(st,
> +                      PIPE_SHADER_FRAGMENT,
> +                      &ctx->FragmentProgram._Current->Base,
> +                      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
> +                      st->state.sampler_views[PIPE_SHADER_FRAGMENT],
> +                      &st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
> +   }
>  }
>
>
> @@ -516,7 +519,7 @@ finalize_textures(struct st_context *st)
>     st->missing_textures = GL_FALSE;
>
>     for (su = 0; su < ctx->Const.MaxTextureCoordUnits; su++) {
> -      if (fprog->Base.SamplersUsed & (1 << su)) {
> +      if (fprog && fprog->Base.SamplersUsed & (1 << su)) {
>           const GLuint texUnit = fprog->Base.SamplerUnits[su];
>           struct gl_texture_object *texObj
>              = ctx->Texture.Unit[texUnit]._Current;
> --
> 2.1.0
>
This just seems super-hacky. Given that we set _MaintainTexEnvProgram
it seems reasonable to assume there will always be one there. IMHO the
core should be fixed to not allow this situation to occur in the first
place...

On Mon, Jun 29, 2015 at 10:08 AM, Marek Olšák <maraeo@gmail.com> wrote:
> Ping
>
> On Fri, Jun 26, 2015 at 11:01 AM, Marek Olšák <maraeo@gmail.com> wrote:
>> From: Marek Olšák <marek.olsak@amd.com>
>>
>> No states are initialized at that point yet.
>>
>> Cc: 10.5 10.6 <mesa-stable@lists.freedesktop.org>
>> ---
>>  src/mesa/state_tracker/st_atom_constbuf.c | 14 ++++++++------
>>  src/mesa/state_tracker/st_atom_sampler.c  | 30 +++++++++++++++++-------------
>>  src/mesa/state_tracker/st_atom_shader.c   |  8 ++++++--
>>  src/mesa/state_tracker/st_atom_texture.c  | 19 +++++++++++--------
>>  4 files changed, 42 insertions(+), 29 deletions(-)
>>
>> diff --git a/src/mesa/state_tracker/st_atom_constbuf.c b/src/mesa/state_tracker/st_atom_constbuf.c
>> index a54e0d9..a31765c 100644
>> --- a/src/mesa/state_tracker/st_atom_constbuf.c
>> +++ b/src/mesa/state_tracker/st_atom_constbuf.c
>> @@ -117,10 +117,11 @@ void st_upload_constants( struct st_context *st,
>>   */
>>  static void update_vs_constants(struct st_context *st )
>>  {
>> -   struct st_vertex_program *vp = st->vp;
>> -   struct gl_program_parameter_list *params = vp->Base.Base.Parameters;
>> +   if (st->vp) {
>> +      struct gl_program_parameter_list *params = st->vp->Base.Base.Parameters;
>>
>> -   st_upload_constants( st, params, PIPE_SHADER_VERTEX );
>> +      st_upload_constants(st, params, PIPE_SHADER_VERTEX);
>> +   }
>>  }
>>
>>
>> @@ -140,10 +141,11 @@ const struct st_tracked_state st_update_vs_constants = {
>>   */
>>  static void update_fs_constants(struct st_context *st )
>>  {
>> -   struct st_fragment_program *fp = st->fp;
>> -   struct gl_program_parameter_list *params = fp->Base.Base.Parameters;
>> +   if (st->fp) {
>> +      struct gl_program_parameter_list *params = st->fp->Base.Base.Parameters;
>>
>> -   st_upload_constants( st, params, PIPE_SHADER_FRAGMENT );
>> +      st_upload_constants(st, params, PIPE_SHADER_FRAGMENT);
>> +   }
>>  }
>>
>>
>> diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
>> index b68eb16..96ba3f4 100644
>> --- a/src/mesa/state_tracker/st_atom_sampler.c
>> +++ b/src/mesa/state_tracker/st_atom_sampler.c
>> @@ -284,19 +284,23 @@ update_samplers(struct st_context *st)
>>  {
>>     const struct gl_context *ctx = st->ctx;
>>
>> -   update_shader_samplers(st,
>> -                          PIPE_SHADER_FRAGMENT,
>> -                          &ctx->FragmentProgram._Current->Base,
>> -                          ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>> -                          st->state.samplers[PIPE_SHADER_FRAGMENT],
>> -                          &st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
>> -
>> -   update_shader_samplers(st,
>> -                          PIPE_SHADER_VERTEX,
>> -                          &ctx->VertexProgram._Current->Base,
>> -                          ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits,
>> -                          st->state.samplers[PIPE_SHADER_VERTEX],
>> -                          &st->state.num_samplers[PIPE_SHADER_VERTEX]);
>> +   if (ctx->FragmentProgram._Current) {
>> +      update_shader_samplers(st,
>> +                             PIPE_SHADER_FRAGMENT,
>> +                             &ctx->FragmentProgram._Current->Base,
>> +                             ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>> +                             st->state.samplers[PIPE_SHADER_FRAGMENT],
>> +                             &st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
>> +   }
>> +
>> +   if (ctx->VertexProgram._Current) {
>> +      update_shader_samplers(st,
>> +                             PIPE_SHADER_VERTEX,
>> +                             &ctx->VertexProgram._Current->Base,
>> +                             ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits,
>> +                             st->state.samplers[PIPE_SHADER_VERTEX],
>> +                             &st->state.num_samplers[PIPE_SHADER_VERTEX]);
>> +   }
>>
>>     if (ctx->GeometryProgram._Current) {
>>        update_shader_samplers(st,
>> diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c
>> index ad8d262..9ce71b2 100644
>> --- a/src/mesa/state_tracker/st_atom_shader.c
>> +++ b/src/mesa/state_tracker/st_atom_shader.c
>> @@ -77,7 +77,9 @@ update_fp( struct st_context *st )
>>     struct st_fragment_program *stfp;
>>     struct st_fp_variant_key key;
>>
>> -   assert(st->ctx->FragmentProgram._Current);
>> +   if (!st->ctx->FragmentProgram._Current)
>> +      return;
>> +
>>     stfp = st_fragment_program(st->ctx->FragmentProgram._Current);
>>     assert(stfp->Base.Base.Target == GL_FRAGMENT_PROGRAM_ARB);
>>
>> @@ -132,7 +134,9 @@ update_vp( struct st_context *st )
>>     /* find active shader and params -- Should be covered by
>>      * ST_NEW_VERTEX_PROGRAM
>>      */
>> -   assert(st->ctx->VertexProgram._Current);
>> +   if (!st->ctx->VertexProgram._Current)
>> +      return;
>> +
>>     stvp = st_vertex_program(st->ctx->VertexProgram._Current);
>>     assert(stvp->Base.Base.Target == GL_VERTEX_PROGRAM_ARB);
>>
>> diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
>> index 04ba864..bcdeaa5 100644
>> --- a/src/mesa/state_tracker/st_atom_texture.c
>> +++ b/src/mesa/state_tracker/st_atom_texture.c
>> @@ -433,7 +433,8 @@ update_vertex_textures(struct st_context *st)
>>  {
>>     const struct gl_context *ctx = st->ctx;
>>
>> -   if (ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) {
>> +   if (ctx->VertexProgram._Current &&
>> +       ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) {
>>        update_textures(st,
>>                        PIPE_SHADER_VERTEX,
>>                        &ctx->VertexProgram._Current->Base,
>> @@ -449,12 +450,14 @@ update_fragment_textures(struct st_context *st)
>>  {
>>     const struct gl_context *ctx = st->ctx;
>>
>> -   update_textures(st,
>> -                   PIPE_SHADER_FRAGMENT,
>> -                   &ctx->FragmentProgram._Current->Base,
>> -                   ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>> -                   st->state.sampler_views[PIPE_SHADER_FRAGMENT],
>> -                   &st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
>> +   if (ctx->FragmentProgram._Current) {
>> +      update_textures(st,
>> +                      PIPE_SHADER_FRAGMENT,
>> +                      &ctx->FragmentProgram._Current->Base,
>> +                      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>> +                      st->state.sampler_views[PIPE_SHADER_FRAGMENT],
>> +                      &st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
>> +   }
>>  }
>>
>>
>> @@ -516,7 +519,7 @@ finalize_textures(struct st_context *st)
>>     st->missing_textures = GL_FALSE;
>>
>>     for (su = 0; su < ctx->Const.MaxTextureCoordUnits; su++) {
>> -      if (fprog->Base.SamplersUsed & (1 << su)) {
>> +      if (fprog && fprog->Base.SamplersUsed & (1 << su)) {
>>           const GLuint texUnit = fprog->Base.SamplerUnits[su];
>>           struct gl_texture_object *texObj
>>              = ctx->Texture.Unit[texUnit]._Current;
>> --
>> 2.1.0
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
I can imagine an app calling glBlitFramebuffer only. Why would the
driver generate a fixed-func fragment program then?

Marek

On Mon, Jun 29, 2015 at 4:10 PM, Ilia Mirkin <imirkin@alum.mit.edu> wrote:
> This just seems super-hacky. Given that we set _MaintainTexEnvProgram
> it seems reasonable to assume there will always be one there. IMHO the
> core should be fixed to not allow this situation to occur in the first
> place...
>
> On Mon, Jun 29, 2015 at 10:08 AM, Marek Olšák <maraeo@gmail.com> wrote:
>> Ping
>>
>> On Fri, Jun 26, 2015 at 11:01 AM, Marek Olšák <maraeo@gmail.com> wrote:
>>> From: Marek Olšák <marek.olsak@amd.com>
>>>
>>> No states are initialized at that point yet.
>>>
>>> Cc: 10.5 10.6 <mesa-stable@lists.freedesktop.org>
>>> ---
>>>  src/mesa/state_tracker/st_atom_constbuf.c | 14 ++++++++------
>>>  src/mesa/state_tracker/st_atom_sampler.c  | 30 +++++++++++++++++-------------
>>>  src/mesa/state_tracker/st_atom_shader.c   |  8 ++++++--
>>>  src/mesa/state_tracker/st_atom_texture.c  | 19 +++++++++++--------
>>>  4 files changed, 42 insertions(+), 29 deletions(-)
>>>
>>> diff --git a/src/mesa/state_tracker/st_atom_constbuf.c b/src/mesa/state_tracker/st_atom_constbuf.c
>>> index a54e0d9..a31765c 100644
>>> --- a/src/mesa/state_tracker/st_atom_constbuf.c
>>> +++ b/src/mesa/state_tracker/st_atom_constbuf.c
>>> @@ -117,10 +117,11 @@ void st_upload_constants( struct st_context *st,
>>>   */
>>>  static void update_vs_constants(struct st_context *st )
>>>  {
>>> -   struct st_vertex_program *vp = st->vp;
>>> -   struct gl_program_parameter_list *params = vp->Base.Base.Parameters;
>>> +   if (st->vp) {
>>> +      struct gl_program_parameter_list *params = st->vp->Base.Base.Parameters;
>>>
>>> -   st_upload_constants( st, params, PIPE_SHADER_VERTEX );
>>> +      st_upload_constants(st, params, PIPE_SHADER_VERTEX);
>>> +   }
>>>  }
>>>
>>>
>>> @@ -140,10 +141,11 @@ const struct st_tracked_state st_update_vs_constants = {
>>>   */
>>>  static void update_fs_constants(struct st_context *st )
>>>  {
>>> -   struct st_fragment_program *fp = st->fp;
>>> -   struct gl_program_parameter_list *params = fp->Base.Base.Parameters;
>>> +   if (st->fp) {
>>> +      struct gl_program_parameter_list *params = st->fp->Base.Base.Parameters;
>>>
>>> -   st_upload_constants( st, params, PIPE_SHADER_FRAGMENT );
>>> +      st_upload_constants(st, params, PIPE_SHADER_FRAGMENT);
>>> +   }
>>>  }
>>>
>>>
>>> diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
>>> index b68eb16..96ba3f4 100644
>>> --- a/src/mesa/state_tracker/st_atom_sampler.c
>>> +++ b/src/mesa/state_tracker/st_atom_sampler.c
>>> @@ -284,19 +284,23 @@ update_samplers(struct st_context *st)
>>>  {
>>>     const struct gl_context *ctx = st->ctx;
>>>
>>> -   update_shader_samplers(st,
>>> -                          PIPE_SHADER_FRAGMENT,
>>> -                          &ctx->FragmentProgram._Current->Base,
>>> -                          ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>>> -                          st->state.samplers[PIPE_SHADER_FRAGMENT],
>>> -                          &st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
>>> -
>>> -   update_shader_samplers(st,
>>> -                          PIPE_SHADER_VERTEX,
>>> -                          &ctx->VertexProgram._Current->Base,
>>> -                          ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits,
>>> -                          st->state.samplers[PIPE_SHADER_VERTEX],
>>> -                          &st->state.num_samplers[PIPE_SHADER_VERTEX]);
>>> +   if (ctx->FragmentProgram._Current) {
>>> +      update_shader_samplers(st,
>>> +                             PIPE_SHADER_FRAGMENT,
>>> +                             &ctx->FragmentProgram._Current->Base,
>>> +                             ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>>> +                             st->state.samplers[PIPE_SHADER_FRAGMENT],
>>> +                             &st->state.num_samplers[PIPE_SHADER_FRAGMENT]);
>>> +   }
>>> +
>>> +   if (ctx->VertexProgram._Current) {
>>> +      update_shader_samplers(st,
>>> +                             PIPE_SHADER_VERTEX,
>>> +                             &ctx->VertexProgram._Current->Base,
>>> +                             ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits,
>>> +                             st->state.samplers[PIPE_SHADER_VERTEX],
>>> +                             &st->state.num_samplers[PIPE_SHADER_VERTEX]);
>>> +   }
>>>
>>>     if (ctx->GeometryProgram._Current) {
>>>        update_shader_samplers(st,
>>> diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c
>>> index ad8d262..9ce71b2 100644
>>> --- a/src/mesa/state_tracker/st_atom_shader.c
>>> +++ b/src/mesa/state_tracker/st_atom_shader.c
>>> @@ -77,7 +77,9 @@ update_fp( struct st_context *st )
>>>     struct st_fragment_program *stfp;
>>>     struct st_fp_variant_key key;
>>>
>>> -   assert(st->ctx->FragmentProgram._Current);
>>> +   if (!st->ctx->FragmentProgram._Current)
>>> +      return;
>>> +
>>>     stfp = st_fragment_program(st->ctx->FragmentProgram._Current);
>>>     assert(stfp->Base.Base.Target == GL_FRAGMENT_PROGRAM_ARB);
>>>
>>> @@ -132,7 +134,9 @@ update_vp( struct st_context *st )
>>>     /* find active shader and params -- Should be covered by
>>>      * ST_NEW_VERTEX_PROGRAM
>>>      */
>>> -   assert(st->ctx->VertexProgram._Current);
>>> +   if (!st->ctx->VertexProgram._Current)
>>> +      return;
>>> +
>>>     stvp = st_vertex_program(st->ctx->VertexProgram._Current);
>>>     assert(stvp->Base.Base.Target == GL_VERTEX_PROGRAM_ARB);
>>>
>>> diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c
>>> index 04ba864..bcdeaa5 100644
>>> --- a/src/mesa/state_tracker/st_atom_texture.c
>>> +++ b/src/mesa/state_tracker/st_atom_texture.c
>>> @@ -433,7 +433,8 @@ update_vertex_textures(struct st_context *st)
>>>  {
>>>     const struct gl_context *ctx = st->ctx;
>>>
>>> -   if (ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) {
>>> +   if (ctx->VertexProgram._Current &&
>>> +       ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits > 0) {
>>>        update_textures(st,
>>>                        PIPE_SHADER_VERTEX,
>>>                        &ctx->VertexProgram._Current->Base,
>>> @@ -449,12 +450,14 @@ update_fragment_textures(struct st_context *st)
>>>  {
>>>     const struct gl_context *ctx = st->ctx;
>>>
>>> -   update_textures(st,
>>> -                   PIPE_SHADER_FRAGMENT,
>>> -                   &ctx->FragmentProgram._Current->Base,
>>> -                   ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>>> -                   st->state.sampler_views[PIPE_SHADER_FRAGMENT],
>>> -                   &st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
>>> +   if (ctx->FragmentProgram._Current) {
>>> +      update_textures(st,
>>> +                      PIPE_SHADER_FRAGMENT,
>>> +                      &ctx->FragmentProgram._Current->Base,
>>> +                      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits,
>>> +                      st->state.sampler_views[PIPE_SHADER_FRAGMENT],
>>> +                      &st->state.num_sampler_views[PIPE_SHADER_FRAGMENT]);
>>> +   }
>>>  }
>>>
>>>
>>> @@ -516,7 +519,7 @@ finalize_textures(struct st_context *st)
>>>     st->missing_textures = GL_FALSE;
>>>
>>>     for (su = 0; su < ctx->Const.MaxTextureCoordUnits; su++) {
>>> -      if (fprog->Base.SamplersUsed & (1 << su)) {
>>> +      if (fprog && fprog->Base.SamplersUsed & (1 << su)) {
>>>           const GLuint texUnit = fprog->Base.SamplerUnits[su];
>>>           struct gl_texture_object *texObj
>>>              = ctx->Texture.Unit[texUnit]._Current;
>>> --
>>> 2.1.0
>>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev@lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev