GLfloat x, GLfloat y,
GLfloat width, GLfloat height)
{
- FLUSH_VERTICES(ctx, _NEW_VIEWPORT);
+ FLUSH_VERTICES(ctx, ctx->DriverFlags.NewViewport ? 0 : _NEW_VIEWPORT);
+ ctx->NewDriverState |= ctx->DriverFlags.NewViewport;
/* clamp width and height to the implementation dependent range */
width = MIN2(width, (GLfloat) ctx->Const.MaxViewportWidth);
}
}
+static void
+viewport_array(struct gl_context *ctx, GLuint first, GLsizei count,
+ const struct gl_viewport_inputs *inputs)
+{
+ for (GLsizei i = 0; i < count; i++) {
+ set_viewport_no_notify(ctx, i + first, inputs[i].X, inputs[i].Y,
+ inputs[i].Width, inputs[i].Height);
+ }
+
+ if (ctx->Driver.Viewport)
+ ctx->Driver.Viewport(ctx);
+}
+
+void GLAPIENTRY
+_mesa_ViewportArrayv_no_error(GLuint first, GLsizei count, const GLfloat *v)
+{
+ GET_CURRENT_CONTEXT(ctx);
+
+ const struct gl_viewport_inputs *const p = (struct gl_viewport_inputs *)v;
+ viewport_array(ctx, first, count, p);
+}
+
void GLAPIENTRY
_mesa_ViewportArrayv(GLuint first, GLsizei count, const GLfloat *v)
{
}
}
- for (i = 0; i < count; i++)
- set_viewport_no_notify(ctx, i + first,
- p[i].X, p[i].Y,
- p[i].Width, p[i].Height);
-
- if (ctx->Driver.Viewport)
- ctx->Driver.Viewport(ctx);
+ viewport_array(ctx, first, count, p);
}
static void
-ViewportIndexedf(GLuint index, GLfloat x, GLfloat y,
- GLfloat w, GLfloat h, const char *function)
+viewport_indexed_err(struct gl_context *ctx, GLuint index, GLfloat x, GLfloat y,
+ GLfloat w, GLfloat h, const char *function)
{
- GET_CURRENT_CONTEXT(ctx);
-
if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "%s(%d, %f, %f, %f, %f)\n",
function, index, x, y, w, h);
_mesa_set_viewport(ctx, index, x, y, w, h);
}
+void GLAPIENTRY
+_mesa_ViewportIndexedf_no_error(GLuint index, GLfloat x, GLfloat y,
+ GLfloat w, GLfloat h)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ _mesa_set_viewport(ctx, index, x, y, w, h);
+}
+
void GLAPIENTRY
_mesa_ViewportIndexedf(GLuint index, GLfloat x, GLfloat y,
GLfloat w, GLfloat h)
{
- ViewportIndexedf(index, x, y, w, h, "glViewportIndexedf");
+ GET_CURRENT_CONTEXT(ctx);
+ viewport_indexed_err(ctx, index, x, y, w, h, "glViewportIndexedf");
+}
+
+void GLAPIENTRY
+_mesa_ViewportIndexedfv_no_error(GLuint index, const GLfloat *v)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ _mesa_set_viewport(ctx, index, v[0], v[1], v[2], v[3]);
}
void GLAPIENTRY
_mesa_ViewportIndexedfv(GLuint index, const GLfloat *v)
{
- ViewportIndexedf(index, v[0], v[1], v[2], v[3], "glViewportIndexedfv");
+ GET_CURRENT_CONTEXT(ctx);
+ viewport_indexed_err(ctx, index, v[0], v[1], v[2], v[3],
+ "glViewportIndexedfv");
}
static void
ctx->ViewportArray[idx].Far == farval)
return;
+ /* The depth range is needed by program state constants. */
FLUSH_VERTICES(ctx, _NEW_VIEWPORT);
+ ctx->NewDriverState |= ctx->DriverFlags.NewViewport;
ctx->ViewportArray[idx].Near = CLAMP(nearval, 0.0, 1.0);
ctx->ViewportArray[idx].Far = CLAMP(farval, 0.0, 1.0);
}
-extern void GLAPIENTRY
+static void
+clip_control(struct gl_context *ctx, GLenum origin, GLenum depth)
+{
+ if (ctx->Transform.ClipOrigin == origin &&
+ ctx->Transform.ClipDepthMode == depth)
+ return;
+
+ /* Affects transform state and the viewport transform */
+ FLUSH_VERTICES(ctx, ctx->DriverFlags.NewClipControl ? 0 :
+ _NEW_TRANSFORM | _NEW_VIEWPORT);
+ ctx->NewDriverState |= ctx->DriverFlags.NewClipControl;
+
+ if (ctx->Transform.ClipOrigin != origin) {
+ ctx->Transform.ClipOrigin = origin;
+
+ /* Affects the winding order of the front face. */
+ if (ctx->DriverFlags.NewPolygonState)
+ ctx->NewDriverState |= ctx->DriverFlags.NewPolygonState;
+ else
+ ctx->NewState |= _NEW_POLYGON;
+
+ if (ctx->Driver.FrontFace)
+ ctx->Driver.FrontFace(ctx, ctx->Polygon.FrontFace);
+ }
+
+ if (ctx->Transform.ClipDepthMode != depth) {
+ ctx->Transform.ClipDepthMode = depth;
+
+ if (ctx->Driver.DepthRange)
+ ctx->Driver.DepthRange(ctx);
+ }
+}
+
+
+void GLAPIENTRY
+_mesa_ClipControl_no_error(GLenum origin, GLenum depth)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ clip_control(ctx, origin, depth);
+}
+
+
+void GLAPIENTRY
_mesa_ClipControl(GLenum origin, GLenum depth)
{
GET_CURRENT_CONTEXT(ctx);
- if (MESA_VERBOSE&VERBOSE_API)
+ if (MESA_VERBOSE & VERBOSE_API)
_mesa_debug(ctx, "glClipControl(%s, %s)\n",
_mesa_enum_to_string(origin),
_mesa_enum_to_string(depth));
return;
}
- if (ctx->Transform.ClipOrigin == origin &&
- ctx->Transform.ClipDepthMode == depth)
- return;
-
- /* Affects transform state and the viewport transform */
- FLUSH_VERTICES(ctx, _NEW_TRANSFORM | _NEW_VIEWPORT);
-
- if (ctx->Transform.ClipOrigin != origin) {
- ctx->Transform.ClipOrigin = origin;
-
- /* Affects the winding order of the front face. */
- ctx->NewState |= _NEW_POLYGON;
-
- if (ctx->Driver.FrontFace)
- ctx->Driver.FrontFace(ctx, ctx->Polygon.FrontFace);
- }
-
- if (ctx->Transform.ClipDepthMode != depth) {
- ctx->Transform.ClipDepthMode = depth;
-
- if (ctx->Driver.DepthRange)
- ctx->Driver.DepthRange(ctx);
- }
+ clip_control(ctx, origin, depth);
}
/**