X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_cb_feedback.c;h=1a02d8c5524eb3b9b91605e2856f9d844a02141c;hb=1b8edffaa5816449436fac981fd27005fcede8c9;hp=19021411cfc9ec9fc6581d6c4cd2400ad3768d84;hpb=3a3801c1431203fc4dca24d56577995ae2e78956;p=mesa.git diff --git a/src/mesa/state_tracker/st_cb_feedback.c b/src/mesa/state_tracker/st_cb_feedback.c index 19021411cfc..1a02d8c5524 100644 --- a/src/mesa/state_tracker/st_cb_feedback.c +++ b/src/mesa/state_tracker/st_cb_feedback.c @@ -1,6 +1,6 @@ /************************************************************************** * - * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. + * Copyright 2007 VMware, Inc. * All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a @@ -18,7 +18,7 @@ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. - * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -40,20 +40,18 @@ #include "main/imports.h" #include "main/context.h" #include "main/feedback.h" -#include "main/macros.h" +#include "main/varray.h" #include "vbo/vbo.h" #include "st_context.h" -#include "st_atom.h" #include "st_draw.h" #include "st_cb_feedback.h" -#include "st_cb_bufferobjects.h" +#include "st_program.h" +#include "st_util.h" #include "pipe/p_context.h" #include "pipe/p_defines.h" -#include "pipe/p_winsys.h" -#include "cso_cache/cso_cache.h" #include "draw/draw_context.h" #include "draw/draw_pipe.h" @@ -65,7 +63,7 @@ struct feedback_stage { struct draw_stage stage; /**< Base class */ - GLcontext *ctx; /**< Rendering context */ + struct gl_context *ctx; /**< Rendering context */ GLboolean reset_stipple_counter; }; @@ -74,7 +72,7 @@ struct feedback_stage * GL Feedback functions **********************************************************************/ -static INLINE struct feedback_stage * +static inline struct feedback_stage * feedback_stage( struct draw_stage *stage ) { return (struct feedback_stage *)stage; @@ -82,18 +80,20 @@ feedback_stage( struct draw_stage *stage ) static void -feedback_vertex(GLcontext *ctx, const struct draw_context *draw, +feedback_vertex(struct gl_context *ctx, const struct draw_context *draw, const struct vertex_header *v) { - const struct st_context *st = ctx->st; + const struct st_context *st = st_context(ctx); + struct st_vertex_program *stvp = (struct st_vertex_program *)st->vp; GLfloat win[4]; const GLfloat *color, *texcoord; - const GLfloat ci = 0; GLuint slot; - /* Recall that Y=0=Top of window for Gallium wincoords */ win[0] = v->data[0][0]; - win[1] = ctx->DrawBuffer->Height - v->data[0][1]; + if (st_fb_orientation(ctx->DrawBuffer) == Y_0_TOP) + win[1] = ctx->DrawBuffer->Height - v->data[0][1]; + else + win[1] = v->data[0][1]; win[2] = v->data[0][2]; win[3] = 1.0F / v->data[0][3]; @@ -102,19 +102,19 @@ feedback_vertex(GLcontext *ctx, const struct draw_context *draw, * color and texcoord attribs to use here. */ - slot = st->vertex_result_to_slot[VERT_RESULT_COL0]; + slot = stvp->result_to_output[VARYING_SLOT_COL0]; if (slot != ~0U) color = v->data[slot]; else color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0]; - slot = st->vertex_result_to_slot[VERT_RESULT_TEX0]; + slot = stvp->result_to_output[VARYING_SLOT_TEX0]; if (slot != ~0U) texcoord = v->data[slot]; else texcoord = ctx->Current.Attrib[VERT_ATTRIB_TEX0]; - _mesa_feedback_vertex(ctx, win, color, ci, texcoord); + _mesa_feedback_vertex(ctx, win, color, texcoord); } @@ -123,8 +123,8 @@ feedback_tri( struct draw_stage *stage, struct prim_header *prim ) { struct feedback_stage *fs = feedback_stage(stage); struct draw_context *draw = stage->draw; - FEEDBACK_TOKEN(fs->ctx, (GLfloat) GL_POLYGON_TOKEN); - FEEDBACK_TOKEN(fs->ctx, (GLfloat) 3); /* three vertices */ + _mesa_feedback_token(fs->ctx, (GLfloat) GL_POLYGON_TOKEN); + _mesa_feedback_token(fs->ctx, (GLfloat) 3); /* three vertices */ feedback_vertex(fs->ctx, draw, prim->v[0]); feedback_vertex(fs->ctx, draw, prim->v[1]); feedback_vertex(fs->ctx, draw, prim->v[2]); @@ -137,11 +137,11 @@ feedback_line( struct draw_stage *stage, struct prim_header *prim ) struct feedback_stage *fs = feedback_stage(stage); struct draw_context *draw = stage->draw; if (fs->reset_stipple_counter) { - FEEDBACK_TOKEN(fs->ctx, (GLfloat) GL_LINE_RESET_TOKEN); + _mesa_feedback_token(fs->ctx, (GLfloat) GL_LINE_RESET_TOKEN); fs->reset_stipple_counter = GL_FALSE; } else { - FEEDBACK_TOKEN(fs->ctx, (GLfloat) GL_LINE_TOKEN); + _mesa_feedback_token(fs->ctx, (GLfloat) GL_LINE_TOKEN); } feedback_vertex(fs->ctx, draw, prim->v[0]); feedback_vertex(fs->ctx, draw, prim->v[1]); @@ -153,7 +153,7 @@ feedback_point( struct draw_stage *stage, struct prim_header *prim ) { struct feedback_stage *fs = feedback_stage(stage); struct draw_context *draw = stage->draw; - FEEDBACK_TOKEN(fs->ctx, (GLfloat) GL_POINT_TOKEN); + _mesa_feedback_token(fs->ctx, (GLfloat) GL_POINT_TOKEN); feedback_vertex(fs->ctx, draw, prim->v[0]); } @@ -176,16 +176,16 @@ feedback_reset_stipple_counter( struct draw_stage *stage ) static void feedback_destroy( struct draw_stage *stage ) { - /* no-op */ + free(stage); } /** * Create GL feedback drawing stage. */ static struct draw_stage * -draw_glfeedback_stage(GLcontext *ctx, struct draw_context *draw) +draw_glfeedback_stage(struct gl_context *ctx, struct draw_context *draw) { - struct feedback_stage *fs = CALLOC_STRUCT(feedback_stage); + struct feedback_stage *fs = ST_CALLOC_STRUCT(feedback_stage); fs->stage.draw = draw; fs->stage.next = NULL; @@ -248,7 +248,7 @@ select_reset_stipple_counter( struct draw_stage *stage ) static void select_destroy( struct draw_stage *stage ) { - /* no-op */ + free(stage); } @@ -256,9 +256,9 @@ select_destroy( struct draw_stage *stage ) * Create GL selection mode drawing stage. */ static struct draw_stage * -draw_glselect_stage(GLcontext *ctx, struct draw_context *draw) +draw_glselect_stage(struct gl_context *ctx, struct draw_context *draw) { - struct feedback_stage *fs = CALLOC_STRUCT(feedback_stage); + struct feedback_stage *fs = ST_CALLOC_STRUCT(feedback_stage); fs->stage.draw = draw; fs->stage.next = NULL; @@ -275,30 +275,36 @@ draw_glselect_stage(GLcontext *ctx, struct draw_context *draw) static void -st_RenderMode(GLcontext *ctx, GLenum newMode ) +st_RenderMode(struct gl_context *ctx, GLenum newMode ) { - struct st_context *st = ctx->st; - struct draw_context *draw = st->draw; + struct st_context *st = st_context(ctx); + struct draw_context *draw = st_get_draw_context(st); + + if (!st->draw) + return; if (newMode == GL_RENDER) { /* restore normal VBO draw function */ - vbo_set_draw_func(ctx, st_draw_vbo); + st_init_draw_functions(&ctx->Driver); } else if (newMode == GL_SELECT) { if (!st->selection_stage) st->selection_stage = draw_glselect_stage(ctx, draw); draw_set_rasterize_stage(draw, st->selection_stage); /* Plug in new vbo draw function */ - vbo_set_draw_func(ctx, st_feedback_draw_vbo); + ctx->Driver.Draw = st_feedback_draw_vbo; } else { + struct gl_program *vp = st->ctx->VertexProgram._Current; + if (!st->feedback_stage) st->feedback_stage = draw_glfeedback_stage(ctx, draw); draw_set_rasterize_stage(draw, st->feedback_stage); /* Plug in new vbo draw function */ - vbo_set_draw_func(ctx, st_feedback_draw_vbo); + ctx->Driver.Draw = st_feedback_draw_vbo; /* need to generate/use a vertex program that emits pos/color/tex */ - st->dirty.st |= ST_NEW_VERTEX_PROGRAM; + if (vp) + st->dirty |= ST_NEW_VERTEX_PROGRAM(st, st_program(vp)); } }