diff options
Diffstat (limited to 'src/mesa/state_tracker')
| -rw-r--r-- | src/mesa/state_tracker/st_cb_texture.c | 2 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_extensions.c | 65 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_gl_api.h | 2 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_manager.c | 123 | 
4 files changed, 89 insertions, 103 deletions
| diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c index 9eb14033ee..124cd32e13 100644 --- a/src/mesa/state_tracker/st_cb_texture.c +++ b/src/mesa/state_tracker/st_cb_texture.c @@ -996,6 +996,8 @@ st_get_tex_image(GLcontext * ctx, GLenum target, GLint level,     dest = (GLubyte *) pixels; +   _mesa_set_fetch_functions(texImage, get_texture_dims(target)); +     for (i = 0; i < depth; i++) {        if (compressed_dst) {  	 _mesa_get_compressed_teximage(ctx, target, level, dest, diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c index 6cd74db897..4c223f3374 100644 --- a/src/mesa/state_tracker/st_extensions.c +++ b/src/mesa/state_tracker/st_extensions.c @@ -68,6 +68,7 @@ void st_init_limits(struct st_context *st)     struct pipe_screen *screen = st->pipe->screen;     struct gl_constants *c = &st->ctx->Const;     struct gl_program_constants *pc; +   unsigned i;     c->MaxTextureLevels        = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS), @@ -134,40 +135,54 @@ void st_init_limits(struct st_context *st)        = CLAMP(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS),                1, MAX_DRAW_BUFFERS); -   /* Is TGSI_OPCODE_CONT supported? */ -   /* XXX separate query for early function return? */ -   st->ctx->Shader.EmitContReturn = -      screen->get_param(screen, PIPE_CAP_TGSI_CONT_SUPPORTED); -     /* Quads always follow GL provoking rules. */     c->QuadsFollowProvokingVertexConvention = GL_FALSE; -   pc = &c->FragmentProgram; -   pc->MaxNativeInstructions    = screen->get_param(screen, PIPE_CAP_MAX_FS_INSTRUCTIONS); -   pc->MaxNativeAluInstructions = screen->get_param(screen, PIPE_CAP_MAX_FS_ALU_INSTRUCTIONS); -   pc->MaxNativeTexInstructions = screen->get_param(screen, PIPE_CAP_MAX_FS_TEX_INSTRUCTIONS); -   pc->MaxNativeTexIndirections = screen->get_param(screen, PIPE_CAP_MAX_FS_TEX_INDIRECTIONS); -   pc->MaxNativeAttribs         = screen->get_param(screen, PIPE_CAP_MAX_FS_INPUTS); -   pc->MaxNativeTemps           = screen->get_param(screen, PIPE_CAP_MAX_FS_TEMPS); -   pc->MaxNativeAddressRegs     = screen->get_param(screen, PIPE_CAP_MAX_FS_ADDRS); -   pc->MaxNativeParameters      = screen->get_param(screen, PIPE_CAP_MAX_FS_CONSTS); +   for(i = 0; i < MESA_SHADER_TYPES; ++i) { +      struct gl_shader_compiler_options *options = &st->ctx->ShaderCompilerOptions[i]; +      switch(i) +      { +      case PIPE_SHADER_FRAGMENT: +         pc = &c->FragmentProgram; +         break; +      case PIPE_SHADER_VERTEX: +         pc = &c->VertexProgram; +         break; +      case PIPE_SHADER_GEOMETRY: +         pc = &c->GeometryProgram; +         break; +      } + +      pc->MaxNativeInstructions    = screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_INSTRUCTIONS); +      pc->MaxNativeAluInstructions = screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS); +      pc->MaxNativeTexInstructions = screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS); +      pc->MaxNativeTexIndirections = screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS); +      pc->MaxNativeAttribs         = screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_INPUTS); +      pc->MaxNativeTemps           = screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_TEMPS); +      pc->MaxNativeAddressRegs     = screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_ADDRS); +      pc->MaxNativeParameters      = screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_CONSTS); + +      options->EmitNoNoise = TRUE; -   pc = &c->VertexProgram; -   pc->MaxNativeInstructions    = screen->get_param(screen, PIPE_CAP_MAX_VS_INSTRUCTIONS); -   pc->MaxNativeAluInstructions = screen->get_param(screen, PIPE_CAP_MAX_VS_ALU_INSTRUCTIONS); -   pc->MaxNativeTexInstructions = screen->get_param(screen, PIPE_CAP_MAX_VS_TEX_INSTRUCTIONS); -   pc->MaxNativeTexIndirections = screen->get_param(screen, PIPE_CAP_MAX_VS_TEX_INDIRECTIONS); -   pc->MaxNativeAttribs         = screen->get_param(screen, PIPE_CAP_MAX_VS_INPUTS); -   pc->MaxNativeTemps           = screen->get_param(screen, PIPE_CAP_MAX_VS_TEMPS); -   pc->MaxNativeAddressRegs     = screen->get_param(screen, PIPE_CAP_MAX_VS_ADDRS); -   pc->MaxNativeParameters      = screen->get_param(screen, PIPE_CAP_MAX_VS_CONSTS); +      /* TODO: make these more fine-grained if anyone needs it */ +      options->EmitNoIfs = !screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH); +      options->EmitNoFunctions = !screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH); +      options->EmitNoLoops = !screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH); +      options->EmitNoMainReturn = !screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH); + +      options->EmitNoCont = !screen->get_shader_param(screen, i, PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED); + +      if(options->EmitNoLoops) +         options->MaxUnrollIterations = MIN2(screen->get_shader_param(screen, i, PIPE_SHADER_CAP_MAX_INSTRUCTIONS), 65536); +   }     /* PIPE_CAP_MAX_FS_INPUTS specifies the number of COLORn + GENERICn inputs      * and is set in MaxNativeAttribs. It's always 2 colors + N generic      * attributes. The GLSL compiler never uses COLORn for varyings, so we      * subtract the 2 colors to get the maximum number of varyings (generic      * attributes) supported by a driver. */ -   c->MaxVarying = screen->get_param(screen, PIPE_CAP_MAX_FS_INPUTS) - 2; +   c->MaxVarying = screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, PIPE_SHADER_CAP_MAX_INPUTS) - 2; +   c->MaxVarying = MIN2(c->MaxVarying, MAX_VARYING);  } @@ -401,7 +416,7 @@ void st_init_extensions(struct st_context *st)     }  #endif -   if (screen->get_param(screen, PIPE_CAP_GEOMETRY_SHADER4)) { +   if (screen->get_shader_param(screen, PIPE_SHADER_GEOMETRY, PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) {        ctx->Extensions.ARB_geometry_shader4 = GL_TRUE;     } diff --git a/src/mesa/state_tracker/st_gl_api.h b/src/mesa/state_tracker/st_gl_api.h index 57c6d9f24d..55ad778c97 100644 --- a/src/mesa/state_tracker/st_gl_api.h +++ b/src/mesa/state_tracker/st_gl_api.h @@ -3,7 +3,5 @@  #define ST_GL_API_H  struct st_api *st_gl_api_create(void); -struct st_api *st_gl_api_create_es1(void); -struct st_api *st_gl_api_create_es2(void);  #endif diff --git a/src/mesa/state_tracker/st_manager.c b/src/mesa/state_tracker/st_manager.c index ccce574c36..450b0453cf 100644 --- a/src/mesa/state_tracker/st_manager.c +++ b/src/mesa/state_tracker/st_manager.c @@ -44,6 +44,7 @@  #include "main/framebuffer.h"  #include "main/fbobject.h"  #include "main/renderbuffer.h" +#include "main/version.h"  #include "st_texture.h"  #include "st_context.h" @@ -303,10 +304,6 @@ st_visual_to_context_mode(const struct st_visual *visual,  {     memset(mode, 0, sizeof(*mode)); -   /* FBO-only context */ -   if (!visual) -      return; -     if (st_visual_have_buffers(visual, ST_ATTACHMENT_BACK_LEFT_MASK))        mode->doubleBufferMode = GL_TRUE;     if (st_visual_have_buffers(visual, @@ -612,26 +609,57 @@ st_context_destroy(struct st_context_iface *stctxi)  }  static struct st_context_iface * -create_context(gl_api api, struct st_manager *smapi, -               const struct st_visual *visual, -               struct st_context_iface *shared_stctxi) +st_api_create_context(struct st_api *stapi, struct st_manager *smapi, +                      const struct st_context_attribs *attribs, +                      struct st_context_iface *shared_stctxi)  {     struct st_context *shared_ctx = (struct st_context *) shared_stctxi;     struct st_context *st;     struct pipe_context *pipe;     __GLcontextModes mode; +   gl_api api; + +   if (!(stapi->profile_mask & (1 << attribs->profile))) +      return NULL; + +   switch (attribs->profile) { +   case ST_PROFILE_DEFAULT: +      api = API_OPENGL; +      break; +   case ST_PROFILE_OPENGL_ES1: +      api = API_OPENGLES; +      break; +   case ST_PROFILE_OPENGL_ES2: +      api = API_OPENGLES2; +      break; +   case ST_PROFILE_OPENGL_CORE: +   default: +      return NULL; +      break; +   }     pipe = smapi->screen->context_create(smapi->screen, NULL);     if (!pipe)        return NULL; -   st_visual_to_context_mode(visual, &mode); +   st_visual_to_context_mode(&attribs->visual, &mode);     st = st_create_context(api, pipe, &mode, shared_ctx);     if (!st) {        pipe->destroy(pipe);        return NULL;     } +   /* need to perform version check */ +   if (attribs->major > 1 || attribs->minor > 0) { +      _mesa_compute_version(st->ctx); + +      if (st->ctx->VersionMajor < attribs->major || +          st->ctx->VersionMajor < attribs->minor) { +         st_destroy_context(st); +         return NULL; +      } +   } +     st->invalidate_on_gl_viewport =        smapi->get_param(smapi, ST_MANAGER_BROKEN_INVALIDATE); @@ -646,30 +674,6 @@ create_context(gl_api api, struct st_manager *smapi,     return &st->iface;  } -static struct st_context_iface * -st_api_create_context(struct st_api *stapi, struct st_manager *smapi, -                      const struct st_visual *visual, -                      struct st_context_iface *shared_stctxi) -{ -   return create_context(API_OPENGL, smapi, visual, shared_stctxi); -} - -static struct st_context_iface * -st_api_create_context_es1(struct st_api *stapi, struct st_manager *smapi, -                          const struct st_visual *visual, -                          struct st_context_iface *shared_stctxi) -{ -   return create_context(API_OPENGLES, smapi, visual, shared_stctxi); -} - -static struct st_context_iface * -st_api_create_context_es2(struct st_api *stapi, struct st_manager *smapi, -                          const struct st_visual *visual, -                          struct st_context_iface *shared_stctxi) -{ -   return create_context(API_OPENGLES2, smapi, visual, shared_stctxi); -} -  static boolean  st_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi,                      struct st_framebuffer_iface *stdrawi, @@ -852,6 +856,17 @@ st_manager_add_color_renderbuffer(struct st_context *st, GLframebuffer *fb,  }  static const struct st_api st_gl_api = { +   ST_API_OPENGL, +#if FEATURE_GL +   ST_PROFILE_DEFAULT_MASK | +#endif +#if FEATURE_ES1 +   ST_PROFILE_OPENGL_ES1_MASK | +#endif +#if FEATURE_ES2 +   ST_PROFILE_OPENGL_ES2_MASK | +#endif +   0,     st_api_destroy,     st_api_get_proc_address,     st_api_create_context, @@ -859,52 +874,8 @@ static const struct st_api st_gl_api = {     st_api_get_current,  }; -static const struct st_api st_gl_api_es1 = { -   st_api_destroy, -   st_api_get_proc_address, -   st_api_create_context_es1, -   st_api_make_current, -   st_api_get_current, -}; - -static const struct st_api st_gl_api_es2 = { -   st_api_destroy, -   st_api_get_proc_address, -   st_api_create_context_es2, -   st_api_make_current, -   st_api_get_current, -}; -  struct st_api *  st_gl_api_create(void)  { -   (void) st_gl_api; -   (void) st_gl_api_es1; -   (void) st_gl_api_es2; - -#if FEATURE_GL     return (struct st_api *) &st_gl_api; -#else -   return NULL; -#endif -} - -struct st_api * -st_gl_api_create_es1(void) -{ -#if FEATURE_ES1 -   return (struct st_api *) &st_gl_api_es1; -#else -   return NULL; -#endif -} - -struct st_api * -st_gl_api_create_es2(void) -{ -#if FEATURE_ES2 -   return (struct st_api *) &st_gl_api_es2; -#else -   return NULL; -#endif  } | 
