/**************************************************************************
*
- * 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
* 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.
#include "main/texobj.h"
#include "main/state.h"
#include "main/dd.h"
+#include "main/fbobject.h"
#include "swrast/swrast.h"
#include "swrast_setup/swrast_setup.h"
#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"
intel->vtbl.emit_state(intel);
- intel->no_batch_wrap = GL_TRUE;
-
- /*printf("%s *", __progname);*/
+ intel->no_batch_wrap = true;
/* Emit a slot which will be filled with the inline primitive
* command later.
OUT_BATCH(0);
ADVANCE_BATCH();
- intel->no_batch_wrap = GL_FALSE;
+ intel->no_batch_wrap = false;
/* printf(">"); */
}
* depends on the state just emitted. emit_state should be making sure we
* have the space for this.
*/
- intel->no_batch_wrap = GL_TRUE;
+ intel->no_batch_wrap = true;
+
+ if (intel->always_flush_cache) {
+ intel_batchbuffer_emit_mi_flush(intel);
+ }
#if 0
printf("emitting %d..%d=%d vertices size %d\n", offset,
ADVANCE_BATCH();
}
- intel->no_batch_wrap = GL_FALSE;
+ if (intel->always_flush_cache) {
+ intel_batchbuffer_emit_mi_flush(intel);
+ }
+
+ intel->no_batch_wrap = false;
drm_intel_bo_unreference(vb_bo);
}
* Fixup for I915 WPOS texture coordinate *
***********************************************************************/
+static void
+intel_emit_fragcoord(struct intel_context *intel, intelVertexPtr v)
+{
+ struct gl_context *ctx = &intel->ctx;
+ struct gl_framebuffer *fb = ctx->DrawBuffer;
+ GLuint offset = intel->wpos_offset;
+ float *vertex_position = (float *)v;
+ float *fragcoord = (float *)((char *)v + offset);
+ fragcoord[0] = vertex_position[0];
+
+ if (_mesa_is_user_fbo(fb))
+ fragcoord[1] = vertex_position[1];
+ else
+ fragcoord[1] = fb->Height - vertex_position[1];
+
+ fragcoord[2] = vertex_position[2];
+ fragcoord[3] = vertex_position[3];
+}
static void
intel_wpos_triangle(struct intel_context *intel,
intelVertexPtr v0, intelVertexPtr v1, intelVertexPtr v2)
{
- const struct gl_framebuffer *fb = intel->ctx.DrawBuffer;
- GLuint offset = intel->wpos_offset;
- GLuint size = intel->wpos_size;
- GLfloat *v0_wpos = (GLfloat *)((char *)v0 + offset);
- GLfloat *v1_wpos = (GLfloat *)((char *)v1 + offset);
- GLfloat *v2_wpos = (GLfloat *)((char *)v2 + offset);
-
- __memcpy(v0_wpos, v0, size);
- __memcpy(v1_wpos, v1, size);
- __memcpy(v2_wpos, v2, size);
-
- if (!fb->Name) {
- v0_wpos[1] = -v0_wpos[1] + fb->Height;
- v1_wpos[1] = -v1_wpos[1] + fb->Height;
- v2_wpos[1] = -v2_wpos[1] + fb->Height;
- }
+ intel_emit_fragcoord(intel, v0);
+ intel_emit_fragcoord(intel, v1);
+ intel_emit_fragcoord(intel, v2);
intel_draw_triangle(intel, v0, v1, v2);
}
intel_wpos_line(struct intel_context *intel,
intelVertexPtr v0, intelVertexPtr v1)
{
- const struct gl_framebuffer *fb = intel->ctx.DrawBuffer;
- GLuint offset = intel->wpos_offset;
- GLuint size = intel->wpos_size;
- GLfloat *v0_wpos = (GLfloat *)((char *)v0 + offset);
- GLfloat *v1_wpos = (GLfloat *)((char *)v1 + offset);
-
- __memcpy(v0_wpos, v0, size);
- __memcpy(v1_wpos, v1, size);
-
- if (!fb->Name) {
- v0_wpos[1] = -v0_wpos[1] + fb->Height;
- v1_wpos[1] = -v1_wpos[1] + fb->Height;
- }
-
+ intel_emit_fragcoord(intel, v0);
+ intel_emit_fragcoord(intel, v1);
intel_draw_line(intel, v0, v1);
}
static void
intel_wpos_point(struct intel_context *intel, intelVertexPtr v0)
{
- const struct gl_framebuffer *fb = intel->ctx.DrawBuffer;
- GLuint offset = intel->wpos_offset;
- GLuint size = intel->wpos_size;
- GLfloat *v0_wpos = (GLfloat *)((char *)v0 + offset);
-
- __memcpy(v0_wpos, v0, size);
-
- if (!fb->Name)
- v0_wpos[1] = -v0_wpos[1] + fb->Height;
-
+ intel_emit_fragcoord(intel, v0);
intel_draw_point(intel, v0);
}
} 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
} 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
struct intel_context *intel = intel_context(ctx); \
GLuint color[n] = { 0, }, spec[n] = { 0, }; \
GLuint coloroffset = intel->coloroffset; \
- GLboolean specoffset = intel->specoffset; \
+ GLuint specoffset = intel->specoffset; \
(void) color; (void) spec; (void) coloroffset; (void) specoffset;
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);
}
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
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);
}
/**********************************************************************/
+#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)
-
-#define ANY_FALLBACK_FLAGS (DD_LINE_STIPPLE | DD_TRI_STIPPLE | DD_POINT_ATTEN | DD_POINT_SMOOTH | DD_TRI_SMOOTH)
+#define ANY_FALLBACK_FLAGS (DD_LINE_STIPPLE | DD_TRI_STIPPLE | DD_POINT_ATTEN)
#define ANY_RASTER_FLAGS (DD_TRI_LIGHT_TWOSIDE | DD_TRI_OFFSET | DD_TRI_UNFILLED)
void
{
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;
- GLboolean have_wpos = (fprog && (fprog->Base.InputsRead & FRAG_BIT_WPOS));
+ bool have_wpos = (fprog && (fprog->Base.InputsRead & VARYING_BIT_POS));
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) {
if ((flags & DD_TRI_STIPPLE) && !intel->hw_stipple)
intel->draw_tri = intel_fallback_tri;
- if (flags & DD_TRI_SMOOTH) {
- if (intel->conformance_mode > 0)
- intel->draw_tri = intel_fallback_tri;
- }
-
if (flags & DD_POINT_ATTEN) {
if (0)
intel->draw_point = intel_atten_point;
intel->draw_point = intel_fallback_point;
}
- if (flags & DD_POINT_SMOOTH) {
- if (intel->conformance_mode > 0)
- intel->draw_point = intel_fallback_point;
- }
-
index |= INTEL_FALLBACK_BIT;
}
}
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);
}
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);
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.
*/
intel->render_primitive = prim;
- /* Shortcircuit this when called from t_dd_rendertmp.h for unfilled
- * triangles. The rasterized primitive will always be reset by
- * lower level functions in that case, potentially pingponging the
- * state:
+ /* Shortcircuit this when called for unfilled triangles. The rasterized
+ * 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.
[19] = "Smooth point",
[20] = "point sprite coord origin",
[21] = "depth/color drawing offset",
+ [22] = "coord replace(SPRITE POINT ENABLE)",
};
* \param bit one of INTEL_FALLBACK_x flags.
*/
void
-intelFallback(struct intel_context *intel, GLbitfield bit, GLboolean mode)
+intelFallback(struct intel_context *intel, GLbitfield bit, bool mode)
{
struct gl_context *ctx = &intel->ctx;
TNLcontext *tnl = TNL_CONTEXT(ctx);
assert(!intel->tnl_pipeline_running);
intel_flush(ctx);
- if (INTEL_DEBUG & DEBUG_FALLBACKS)
+ if (INTEL_DEBUG & DEBUG_PERF)
fprintf(stderr, "ENTER FALLBACK %x: %s\n",
bit, getFallbackString(bit));
_swsetup_Wakeup(ctx);
assert(!intel->tnl_pipeline_running);
_swrast_flush(ctx);
- if (INTEL_DEBUG & DEBUG_FALLBACKS)
+ if (INTEL_DEBUG & DEBUG_PERF)
fprintf(stderr, "LEAVE FALLBACK %s\n", getFallbackString(bit));
tnl->Driver.Render.Start = intelRenderStart;
tnl->Driver.Render.PrimitiveNotify = intelRenderPrimitive;
}
}
-union fi
-{
- GLfloat f;
- GLint i;
-};
-
/**********************************************************************/
/* Initialization. */
/**********************************************************************/