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 <mar...@gmail.com> wrote:
> Ping
>
> On Fri, Jun 26, 2015 at 11:01 AM, Marek Olšák <mar...@gmail.com> wrote:
>> From: Marek Olšák <marek.ol...@amd.com>
>>
>> No states are initialized at that point yet.
>>
>> Cc: 10.5 10.6 <mesa-sta...@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
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to