What about checking has_geometry_shader inside cso module, and make cso_save_geometry_shader no-ops when it's false?
Seems less code and more reusable. Jose ----- Original Message ----- > The code expects the geometry shader to be NULL. > We don't have geometry shaders now, but it's good to be prepared. > --- > src/gallium/auxiliary/util/u_blit.c | 25 > +++++++++++++++++++++++++ > src/gallium/auxiliary/util/u_gen_mipmap.c | 16 ++++++++++++++++ > src/mesa/state_tracker/st_cb_bitmap.c | 11 +++++++++++ > src/mesa/state_tracker/st_cb_clear.c | 9 +++++++++ > src/mesa/state_tracker/st_cb_drawpixels.c | 10 ++++++++++ > src/mesa/state_tracker/st_cb_drawtex.c | 9 +++++++++ > src/mesa/state_tracker/st_context.h | 1 + > src/mesa/state_tracker/st_extensions.c | 4 +++- > 8 files changed, 84 insertions(+), 1 deletions(-) > > diff --git a/src/gallium/auxiliary/util/u_blit.c > b/src/gallium/auxiliary/util/u_blit.c > index 87530e9..190e93f 100644 > --- a/src/gallium/auxiliary/util/u_blit.c > +++ b/src/gallium/auxiliary/util/u_blit.c > @@ -66,6 +66,8 @@ struct blit_state > struct pipe_vertex_element velem[2]; > enum pipe_texture_target internal_target; > > + boolean has_geometry_shader; > + > void *vs; > void *fs[TGSI_WRITEMASK_XYZW + 1]; > void *fs_depth; > @@ -142,6 +144,11 @@ util_create_blit(struct pipe_context *pipe, > struct cso_context *cso) > else > ctx->internal_target = PIPE_TEXTURE_RECT; > > + if (pipe->screen->get_shader_param(pipe->screen, > PIPE_SHADER_GEOMETRY, > + PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > > 0) { > + ctx->has_geometry_shader = TRUE; > + } > + > return ctx; > } > > @@ -531,6 +538,9 @@ util_blit_pixels_writemask(struct blit_state > *ctx, > cso_save_framebuffer(ctx->cso); > cso_save_fragment_shader(ctx->cso); > cso_save_vertex_shader(ctx->cso); > + if (ctx->has_geometry_shader) { > + cso_save_geometry_shader(ctx->cso); > + } > cso_save_clip(ctx->cso); > cso_save_vertex_elements(ctx->cso); > cso_save_vertex_buffers(ctx->cso); > @@ -574,6 +584,9 @@ util_blit_pixels_writemask(struct blit_state > *ctx, > set_fragment_shader(ctx, writemask); > } > set_vertex_shader(ctx); > + if (ctx->has_geometry_shader) { > + cso_set_geometry_shader_handle(ctx->cso, NULL); > + } > > /* drawing dest */ > memset(&fb, 0, sizeof(fb)); > @@ -612,6 +625,9 @@ util_blit_pixels_writemask(struct blit_state > *ctx, > cso_restore_framebuffer(ctx->cso); > cso_restore_fragment_shader(ctx->cso); > cso_restore_vertex_shader(ctx->cso); > + if (ctx->has_geometry_shader) { > + cso_restore_geometry_shader(ctx->cso); > + } > cso_restore_clip(ctx->cso); > cso_restore_vertex_elements(ctx->cso); > cso_restore_vertex_buffers(ctx->cso); > @@ -719,6 +735,9 @@ util_blit_pixels_tex(struct blit_state *ctx, > cso_save_framebuffer(ctx->cso); > cso_save_fragment_shader(ctx->cso); > cso_save_vertex_shader(ctx->cso); > + if (ctx->has_geometry_shader) { > + cso_save_geometry_shader(ctx->cso); > + } > cso_save_clip(ctx->cso); > cso_save_vertex_elements(ctx->cso); > cso_save_vertex_buffers(ctx->cso); > @@ -754,6 +773,9 @@ util_blit_pixels_tex(struct blit_state *ctx, > /* shaders */ > set_fragment_shader(ctx, TGSI_WRITEMASK_XYZW); > set_vertex_shader(ctx); > + if (ctx->has_geometry_shader) { > + cso_set_geometry_shader_handle(ctx->cso, NULL); > + } > > /* drawing dest */ > memset(&fb, 0, sizeof(fb)); > @@ -788,6 +810,9 @@ util_blit_pixels_tex(struct blit_state *ctx, > cso_restore_framebuffer(ctx->cso); > cso_restore_fragment_shader(ctx->cso); > cso_restore_vertex_shader(ctx->cso); > + if (ctx->has_geometry_shader) { > + cso_restore_geometry_shader(ctx->cso); > + } > cso_restore_clip(ctx->cso); > cso_restore_vertex_elements(ctx->cso); > cso_restore_vertex_buffers(ctx->cso); > diff --git a/src/gallium/auxiliary/util/u_gen_mipmap.c > b/src/gallium/auxiliary/util/u_gen_mipmap.c > index 4a16624..92302f5 100644 > --- a/src/gallium/auxiliary/util/u_gen_mipmap.c > +++ b/src/gallium/auxiliary/util/u_gen_mipmap.c > @@ -66,6 +66,8 @@ struct gen_mipmap_state > struct pipe_clip_state clip; > struct pipe_vertex_element velem[2]; > > + boolean has_geometry_shader; > + > void *vs; > void *fs[TGSI_TEXTURE_COUNT]; /**< Not all are used, but > simplifies code */ > > @@ -1308,6 +1310,11 @@ util_create_gen_mipmap(struct pipe_context > *pipe, > ctx->vertices[i][1][3] = 1.0f; /* q */ > } > > + if (pipe->screen->get_shader_param(pipe->screen, > PIPE_SHADER_GEOMETRY, > + PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > > 0) { > + ctx->has_geometry_shader = TRUE; > + } > + > /* Note: the actual vertex buffer is allocated as needed below */ > > return ctx; > @@ -1561,6 +1568,9 @@ util_gen_mipmap(struct gen_mipmap_state *ctx, > cso_save_framebuffer(ctx->cso); > cso_save_fragment_shader(ctx->cso); > cso_save_vertex_shader(ctx->cso); > + if (ctx->has_geometry_shader) { > + cso_save_geometry_shader(ctx->cso); > + } > cso_save_viewport(ctx->cso); > cso_save_clip(ctx->cso); > cso_save_vertex_elements(ctx->cso); > @@ -1574,6 +1584,9 @@ util_gen_mipmap(struct gen_mipmap_state *ctx, > > set_fragment_shader(ctx, type); > set_vertex_shader(ctx); > + if (ctx->has_geometry_shader) { > + cso_set_geometry_shader_handle(ctx->cso, NULL); > + } > > /* init framebuffer state */ > memset(&fb, 0, sizeof(fb)); > @@ -1682,6 +1695,9 @@ util_gen_mipmap(struct gen_mipmap_state *ctx, > cso_restore_framebuffer(ctx->cso); > cso_restore_fragment_shader(ctx->cso); > cso_restore_vertex_shader(ctx->cso); > + if (ctx->has_geometry_shader) { > + cso_restore_geometry_shader(ctx->cso); > + } > cso_restore_viewport(ctx->cso); > cso_restore_clip(ctx->cso); > cso_restore_vertex_elements(ctx->cso); > diff --git a/src/mesa/state_tracker/st_cb_bitmap.c > b/src/mesa/state_tracker/st_cb_bitmap.c > index beb5e7c..307d1eb 100644 > --- a/src/mesa/state_tracker/st_cb_bitmap.c > +++ b/src/mesa/state_tracker/st_cb_bitmap.c > @@ -480,6 +480,9 @@ draw_bitmap_quad(struct gl_context *ctx, GLint x, > GLint y, GLfloat z, > cso_save_viewport(cso); > cso_save_fragment_shader(cso); > cso_save_vertex_shader(cso); > + if (st->has_geometry_shader) { > + cso_save_geometry_shader(cso); > + } > cso_save_vertex_elements(cso); > cso_save_vertex_buffers(cso); > > @@ -493,6 +496,11 @@ draw_bitmap_quad(struct gl_context *ctx, GLint > x, GLint y, GLfloat z, > /* vertex shader state: position + texcoord pass-through */ > cso_set_vertex_shader_handle(cso, st->bitmap.vs); > > + /* geometry shader state: disabled */ > + if (st->has_geometry_shader) { > + cso_set_geometry_shader_handle(cso, NULL); > + } > + > /* user samplers, plus our bitmap sampler */ > { > struct pipe_sampler_state *samplers[PIPE_MAX_SAMPLERS]; > @@ -556,6 +564,9 @@ draw_bitmap_quad(struct gl_context *ctx, GLint x, > GLint y, GLfloat z, > cso_restore_viewport(cso); > cso_restore_fragment_shader(cso); > cso_restore_vertex_shader(cso); > + if (st->has_geometry_shader) { > + cso_restore_geometry_shader(cso); > + } > cso_restore_vertex_elements(cso); > cso_restore_vertex_buffers(cso); > } > diff --git a/src/mesa/state_tracker/st_cb_clear.c > b/src/mesa/state_tracker/st_cb_clear.c > index 83802a5..99d05dc 100644 > --- a/src/mesa/state_tracker/st_cb_clear.c > +++ b/src/mesa/state_tracker/st_cb_clear.c > @@ -246,6 +246,9 @@ clear_with_quad(struct gl_context *ctx, > cso_save_clip(st->cso_context); > cso_save_fragment_shader(st->cso_context); > cso_save_vertex_shader(st->cso_context); > + if (st->has_geometry_shader) { > + cso_save_geometry_shader(st->cso_context); > + } > cso_save_vertex_elements(st->cso_context); > cso_save_vertex_buffers(st->cso_context); > > @@ -321,6 +324,9 @@ clear_with_quad(struct gl_context *ctx, > cso_set_clip(st->cso_context, &st->clear.clip); > set_fragment_shader(st); > set_vertex_shader(st); > + if (st->has_geometry_shader) { > + cso_set_geometry_shader_handle(st->cso_context, NULL); > + } > > if (ctx->DrawBuffer->_ColorDrawBuffers[0]) { > st_translate_color(ctx->Color.ClearColor.f, > @@ -340,6 +346,9 @@ clear_with_quad(struct gl_context *ctx, > cso_restore_clip(st->cso_context); > cso_restore_fragment_shader(st->cso_context); > cso_restore_vertex_shader(st->cso_context); > + if (st->has_geometry_shader) { > + cso_restore_geometry_shader(st->cso_context); > + } > cso_restore_vertex_elements(st->cso_context); > cso_restore_vertex_buffers(st->cso_context); > } > diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c > b/src/mesa/state_tracker/st_cb_drawpixels.c > index 89e0a73..f77ac4c 100644 > --- a/src/mesa/state_tracker/st_cb_drawpixels.c > +++ b/src/mesa/state_tracker/st_cb_drawpixels.c > @@ -671,6 +671,9 @@ draw_textured_quad(struct gl_context *ctx, GLint > x, GLint y, GLfloat z, > cso_save_fragment_sampler_views(cso); > cso_save_fragment_shader(cso); > cso_save_vertex_shader(cso); > + if (st->has_geometry_shader) { > + cso_save_geometry_shader(cso); > + } > cso_save_vertex_elements(cso); > cso_save_vertex_buffers(cso); > if (write_stencil) { > @@ -720,6 +723,10 @@ draw_textured_quad(struct gl_context *ctx, GLint > x, GLint y, GLfloat z, > /* vertex shader state: position + texcoord pass-through */ > cso_set_vertex_shader_handle(cso, driver_vp); > > + /* geometry shader state: disabled */ > + if (st->has_geometry_shader) { > + cso_set_geometry_shader_handle(cso, NULL); > + } > > /* texture sampling state: */ > { > @@ -789,6 +796,9 @@ draw_textured_quad(struct gl_context *ctx, GLint > x, GLint y, GLfloat z, > cso_restore_fragment_sampler_views(cso); > cso_restore_fragment_shader(cso); > cso_restore_vertex_shader(cso); > + if (st->has_geometry_shader) { > + cso_restore_geometry_shader(cso); > + } > cso_restore_vertex_elements(cso); > cso_restore_vertex_buffers(cso); > if (write_stencil) { > diff --git a/src/mesa/state_tracker/st_cb_drawtex.c > b/src/mesa/state_tracker/st_cb_drawtex.c > index 86ceb9d..8047ad9 100644 > --- a/src/mesa/state_tracker/st_cb_drawtex.c > +++ b/src/mesa/state_tracker/st_cb_drawtex.c > @@ -230,6 +230,9 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, > GLfloat y, GLfloat z, > > cso_save_viewport(cso); > cso_save_vertex_shader(cso); > + if (st->has_geometry_shader) { > + cso_save_geometry_shader(cso); > + } > cso_save_vertex_elements(cso); > cso_save_vertex_buffers(cso); > > @@ -238,6 +241,9 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, > GLfloat y, GLfloat z, > semantic_names, semantic_indexes); > cso_set_vertex_shader_handle(cso, vs); > } > + if (st->has_geometry_shader) { > + cso_set_geometry_shader_handle(cso, NULL); > + } > > for (i = 0; i < numAttribs; i++) { > velements[i].src_offset = i * 4 * sizeof(float); > @@ -278,6 +284,9 @@ st_DrawTex(struct gl_context *ctx, GLfloat x, > GLfloat y, GLfloat z, > /* restore state */ > cso_restore_viewport(cso); > cso_restore_vertex_shader(cso); > + if (st->has_geometry_shader) { > + cso_restore_geometry_shader(cso); > + } > cso_restore_vertex_elements(cso); > cso_restore_vertex_buffers(cso); > } > diff --git a/src/mesa/state_tracker/st_context.h > b/src/mesa/state_tracker/st_context.h > index c607809..53bc917 100644 > --- a/src/mesa/state_tracker/st_context.h > +++ b/src/mesa/state_tracker/st_context.h > @@ -77,6 +77,7 @@ struct st_context > struct draw_stage *rastpos_stage; /**< For glRasterPos */ > GLboolean sw_primitive_restart; > > + boolean has_geometry_shader; > > /* On old libGL's for linux we need to invalidate the drawables > * on glViewpport calls, this is set via a option. > diff --git a/src/mesa/state_tracker/st_extensions.c > b/src/mesa/state_tracker/st_extensions.c > index af8cc04..9f98938 100644 > --- a/src/mesa/state_tracker/st_extensions.c > +++ b/src/mesa/state_tracker/st_extensions.c > @@ -555,9 +555,11 @@ void st_init_extensions(struct st_context *st) > ctx->Extensions.ARB_vertex_type_2_10_10_10_rev = GL_TRUE; > } > > - if (screen->get_shader_param(screen, PIPE_SHADER_GEOMETRY, > PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) { > + if (screen->get_shader_param(screen, PIPE_SHADER_GEOMETRY, > + PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > > 0) { > #if 0 /* XXX re-enable when GLSL compiler again supports geometry > shaders */ > ctx->Extensions.ARB_geometry_shader4 = GL_TRUE; > + st->has_geometry_shader = TRUE; > #endif > } > > -- > 1.7.4.1 > > _______________________________________________ > 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