X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi915%2Fintel_tris.c;h=a093a0a7bd28d5fa3eb77348898f614d99c7c1b9;hb=3bcc780126ec3a479429a42befa27f141ebf8d48;hp=24a84cbea5b8c136235c7c06451a50584538125d;hpb=c6a81448f8d55a510d8e32cf28e1e174bf2574dd;p=mesa.git diff --git a/src/mesa/drivers/dri/i915/intel_tris.c b/src/mesa/drivers/dri/i915/intel_tris.c index 24a84cbea5b..a093a0a7bd2 100644 --- a/src/mesa/drivers/dri/i915/intel_tris.c +++ b/src/mesa/drivers/dri/i915/intel_tris.c @@ -1,6 +1,6 @@ /************************************************************************** * - * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. + * Copyright 2003 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. @@ -52,7 +52,6 @@ #include "intel_batchbuffer.h" #include "intel_buffers.h" #include "intel_reg.h" -#include "intel_span.h" #include "i830_context.h" #include "i830_reg.h" #include "i915_context.h" @@ -95,8 +94,6 @@ static void intel_start_inline(struct intel_context *intel, uint32_t prim) intel->no_batch_wrap = true; - /*printf("%s *", __progname);*/ - /* Emit a slot which will be filled with the inline primitive * command later. */ @@ -429,11 +426,7 @@ intel_draw_point(struct intel_context *intel, intelVertexPtr v0) GLuint *vb = intel_get_prim_space(intel, 1); int j; - /* Adjust for sub pixel position -- still required for conform. */ - *(float *) &vb[0] = v0->v.x; - *(float *) &vb[1] = v0->v.y; - for (j = 2; j < vertsize; j++) - vb[j] = v0->ui[j]; + COPY_DWORDS(j, vb, vertsize, v0); } @@ -605,10 +598,10 @@ static struct } rast_tab[INTEL_MAX_TRIFUNC]; -#define DO_FALLBACK (IND & INTEL_FALLBACK_BIT) -#define DO_OFFSET (IND & INTEL_OFFSET_BIT) -#define DO_UNFILLED (IND & INTEL_UNFILLED_BIT) -#define DO_TWOSIDE (IND & INTEL_TWOSIDE_BIT) +#define DO_FALLBACK ((IND & INTEL_FALLBACK_BIT) != 0) +#define DO_OFFSET ((IND & INTEL_OFFSET_BIT) != 0) +#define DO_UNFILLED ((IND & INTEL_UNFILLED_BIT) != 0) +#define DO_TWOSIDE ((IND & INTEL_TWOSIDE_BIT) != 0) #define DO_FLAT 0 #define DO_TRI 1 #define DO_QUAD 1 @@ -641,7 +634,7 @@ do { \ } while (0) -#define DEPTH_SCALE intel->polygon_offset_scale +#define DEPTH_SCALE (ctx->DrawBuffer->Visual.depthBits == 16 ? 1.0 : 2.0) #define UNFILLED_TRI unfilled_tri #define UNFILLED_QUAD unfilled_quad #define VERT_X(_v) _v->v.x @@ -673,16 +666,16 @@ do { \ ***********************************************************************/ static const GLuint hw_prim[GL_POLYGON + 1] = { - PRIM3D_POINTLIST, - PRIM3D_LINELIST, - PRIM3D_LINELIST, - PRIM3D_LINELIST, - PRIM3D_TRILIST, - PRIM3D_TRILIST, - PRIM3D_TRILIST, - PRIM3D_TRILIST, - PRIM3D_TRILIST, - PRIM3D_TRILIST + [GL_POINTS] = PRIM3D_POINTLIST, + [GL_LINES] = PRIM3D_LINELIST, + [GL_LINE_LOOP] = PRIM3D_LINELIST, + [GL_LINE_STRIP] = PRIM3D_LINELIST, + [GL_TRIANGLES] = PRIM3D_TRILIST, + [GL_TRIANGLE_STRIP] = PRIM3D_TRILIST, + [GL_TRIANGLE_FAN] = PRIM3D_TRILIST, + [GL_QUADS] = PRIM3D_TRILIST, + [GL_QUAD_STRIP] = PRIM3D_TRILIST, + [GL_POLYGON] = PRIM3D_TRILIST, }; #define RASTERIZE(x) intelRasterPrimitive( ctx, x, hw_prim[x] ) @@ -801,16 +794,16 @@ intel_fallback_tri(struct intel_context *intel, SWvertex v[3]; if (0) - fprintf(stderr, "\n%s\n", __FUNCTION__); + fprintf(stderr, "\n%s\n", __func__); INTEL_FIREVERTICES(intel); _swsetup_Translate(ctx, v0, &v[0]); _swsetup_Translate(ctx, v1, &v[1]); _swsetup_Translate(ctx, v2, &v[2]); - intelSpanRenderStart(ctx); + _swrast_render_start(ctx); _swrast_Triangle(ctx, &v[0], &v[1], &v[2]); - intelSpanRenderFinish(ctx); + _swrast_render_finish(ctx); } @@ -822,15 +815,15 @@ intel_fallback_line(struct intel_context *intel, SWvertex v[2]; if (0) - fprintf(stderr, "\n%s\n", __FUNCTION__); + fprintf(stderr, "\n%s\n", __func__); INTEL_FIREVERTICES(intel); _swsetup_Translate(ctx, v0, &v[0]); _swsetup_Translate(ctx, v1, &v[1]); - intelSpanRenderStart(ctx); + _swrast_render_start(ctx); _swrast_Line(ctx, &v[0], &v[1]); - intelSpanRenderFinish(ctx); + _swrast_render_finish(ctx); } static void @@ -841,14 +834,14 @@ intel_fallback_point(struct intel_context *intel, SWvertex v[1]; if (0) - fprintf(stderr, "\n%s\n", __FUNCTION__); + fprintf(stderr, "\n%s\n", __func__); INTEL_FIREVERTICES(intel); _swsetup_Translate(ctx, v0, &v[0]); - intelSpanRenderStart(ctx); + _swrast_render_start(ctx); _swrast_Point(ctx, &v[0]); - intelSpanRenderFinish(ctx); + _swrast_render_finish(ctx); } @@ -894,18 +887,11 @@ intelRenderClippedPoly(struct gl_context * ctx, const GLuint * elts, GLuint n) { struct intel_context *intel = intel_context(ctx); TNLcontext *tnl = TNL_CONTEXT(ctx); - struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; GLuint prim = intel->render_primitive; /* Render the new vertices as an unclipped polygon. */ - { - GLuint *tmp = VB->Elts; - VB->Elts = (GLuint *) elts; - tnl->Driver.Render.PrimTabElts[GL_POLYGON] (ctx, 0, n, - PRIM_BEGIN | PRIM_END); - VB->Elts = tmp; - } + _tnl_RenderClippedPolygon(ctx, elts, n); /* Restore the render primitive */ @@ -913,14 +899,6 @@ intelRenderClippedPoly(struct gl_context * ctx, const GLuint * elts, GLuint n) tnl->Driver.Render.PrimitiveNotify(ctx, prim); } -static void -intelRenderClippedLine(struct gl_context * ctx, GLuint ii, GLuint jj) -{ - TNLcontext *tnl = TNL_CONTEXT(ctx); - - tnl->Driver.Render.Line(ctx, ii, jj); -} - static void intelFastRenderClippedPoly(struct gl_context * ctx, const GLuint * elts, GLuint n) { @@ -931,10 +909,18 @@ intelFastRenderClippedPoly(struct gl_context * ctx, const GLuint * elts, GLuint const GLuint *start = (const GLuint *) V(elts[0]); int i, j; - for (i = 2; i < n; i++) { - COPY_DWORDS(j, vb, vertsize, V(elts[i - 1])); - COPY_DWORDS(j, vb, vertsize, V(elts[i])); - COPY_DWORDS(j, vb, vertsize, start); + if (ctx->Light.ProvokingVertex == GL_LAST_VERTEX_CONVENTION) { + for (i = 2; i < n; i++) { + COPY_DWORDS(j, vb, vertsize, V(elts[i - 1])); + COPY_DWORDS(j, vb, vertsize, V(elts[i])); + COPY_DWORDS(j, vb, vertsize, start); + } + } else { + for (i = 2; i < n; i++) { + COPY_DWORDS(j, vb, vertsize, start); + COPY_DWORDS(j, vb, vertsize, V(elts[i - 1])); + COPY_DWORDS(j, vb, vertsize, V(elts[i])); + } } } @@ -943,7 +929,10 @@ intelFastRenderClippedPoly(struct gl_context * ctx, const GLuint * elts, GLuint /**********************************************************************/ - +#define DD_TRI_LIGHT_TWOSIDE (1 << 1) +#define DD_TRI_UNFILLED (1 << 2) +#define DD_TRI_STIPPLE (1 << 4) +#define DD_TRI_OFFSET (1 << 5) #define DD_LINE_STIPPLE (1 << 7) #define DD_POINT_ATTEN (1 << 9) @@ -955,7 +944,15 @@ intelChooseRenderState(struct gl_context * ctx) { TNLcontext *tnl = TNL_CONTEXT(ctx); struct intel_context *intel = intel_context(ctx); - GLuint flags = ctx->_TriangleCaps | + GLuint flags = + ((ctx->Light.Enabled && + ctx->Light.Model.TwoSide) ? DD_TRI_LIGHT_TWOSIDE : 0) | + ((ctx->Polygon.FrontMode != GL_FILL || + ctx->Polygon.BackMode != GL_FILL) ? DD_TRI_UNFILLED : 0) | + (ctx->Polygon.StippleFlag ? DD_TRI_STIPPLE : 0) | + ((ctx->Polygon.OffsetPoint || + ctx->Polygon.OffsetLine || + ctx->Polygon.OffsetFill) ? DD_TRI_OFFSET : 0) | (ctx->Line.StippleFlag ? DD_LINE_STIPPLE : 0) | (ctx->Point._Attenuated ? DD_POINT_ATTEN : 0); const struct gl_fragment_program *fprog = ctx->FragmentProgram._Current; @@ -963,7 +960,7 @@ intelChooseRenderState(struct gl_context * ctx) GLuint index = 0; if (INTEL_DEBUG & DEBUG_STATE) - fprintf(stderr, "\n%s\n", __FUNCTION__); + fprintf(stderr, "\n%s\n", __func__); if ((flags & (ANY_FALLBACK_FLAGS | ANY_RASTER_FLAGS)) || have_wpos) { @@ -1028,23 +1025,23 @@ intelChooseRenderState(struct gl_context * ctx) else { tnl->Driver.Render.PrimTabVerts = _tnl_render_tab_verts; tnl->Driver.Render.PrimTabElts = _tnl_render_tab_elts; - tnl->Driver.Render.ClippedLine = intelRenderClippedLine; + tnl->Driver.Render.ClippedLine = _tnl_RenderClippedLine; tnl->Driver.Render.ClippedPolygon = intelRenderClippedPoly; } } } static const GLenum reduced_prim[GL_POLYGON + 1] = { - GL_POINTS, - GL_LINES, - GL_LINES, - GL_LINES, - GL_TRIANGLES, - GL_TRIANGLES, - GL_TRIANGLES, - GL_TRIANGLES, - GL_TRIANGLES, - GL_TRIANGLES + [GL_POINTS] = GL_POINTS, + [GL_LINES] = GL_LINES, + [GL_LINE_LOOP] = GL_LINES, + [GL_LINE_STRIP] = GL_LINES, + [GL_TRIANGLES] = GL_TRIANGLES, + [GL_TRIANGLE_STRIP] = GL_TRIANGLES, + [GL_TRIANGLE_FAN] = GL_TRIANGLES, + [GL_QUADS] = GL_TRIANGLES, + [GL_QUAD_STRIP] = GL_TRIANGLES, + [GL_POLYGON] = GL_TRIANGLES }; @@ -1085,11 +1082,9 @@ intelRunPipeline(struct gl_context * ctx) intel->NewGLState = 0; } - intel_map_vertex_shader_textures(ctx); intel->tnl_pipeline_running = true; _tnl_run_pipeline(ctx); intel->tnl_pipeline_running = false; - intel_unmap_vertex_shader_textures(ctx); _mesa_unlock_context_textures(ctx); } @@ -1127,8 +1122,8 @@ intelRasterPrimitive(struct gl_context * ctx, GLenum rprim, GLuint hwprim) struct intel_context *intel = intel_context(ctx); if (0) - fprintf(stderr, "%s %s %x\n", __FUNCTION__, - _mesa_lookup_enum_by_nr(rprim), hwprim); + fprintf(stderr, "%s %s %x\n", __func__, + _mesa_enum_to_string(rprim), hwprim); intel->vtbl.reduced_primitive_state(intel, rprim); @@ -1148,9 +1143,11 @@ static void intelRenderPrimitive(struct gl_context * ctx, GLenum prim) { struct intel_context *intel = intel_context(ctx); + GLboolean unfilled = (ctx->Polygon.FrontMode != GL_FILL || + ctx->Polygon.BackMode != GL_FILL); if (0) - fprintf(stderr, "%s %s\n", __FUNCTION__, _mesa_lookup_enum_by_nr(prim)); + fprintf(stderr, "%s %s\n", __func__, _mesa_enum_to_string(prim)); /* Let some clipping routines know which primitive they're dealing * with. @@ -1161,8 +1158,7 @@ intelRenderPrimitive(struct gl_context * ctx, GLenum prim) * primitive will always be reset by lower level functions in that case, * potentially pingponging the state: */ - if (reduced_prim[prim] == GL_TRIANGLES && - (ctx->_TriangleCaps & DD_TRI_UNFILLED)) + if (reduced_prim[prim] == GL_TRIANGLES && unfilled) return; /* Set some primitive-dependent state and Start? a new primitive. @@ -1261,12 +1257,6 @@ intelFallback(struct intel_context *intel, GLbitfield bit, bool mode) } } -union fi -{ - GLfloat f; - GLint i; -}; - /**********************************************************************/ /* Initialization. */ /**********************************************************************/