mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 05:18:08 +02:00
mesa: Add new scissor entry points for GL_ARB_viewport_array
v2 (idr): Use set_scissor_no_notify (and manually notify the driver) instead of calling _mesa_set_scissori. Refactory bodies of _mesa_ScissorIndexed and _mesa_ScissorIndexedv into a shared function. Perform parameter validation in the same order in all three functions. Pull MaxViewports comparison fix (in _mesa_ScissorArrayv) from the next patch to this patch. Signed-off-by: Courtney Goeltzenleuchter <courtney@LunarG.com> Signed-off-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
917db0bc3d
commit
0a7baa68a8
2 changed files with 101 additions and 0 deletions
|
|
@ -114,6 +114,99 @@ _mesa_set_scissor(struct gl_context *ctx, unsigned idx,
|
|||
ctx->Driver.Scissor(ctx);
|
||||
}
|
||||
|
||||
/**
|
||||
* Define count scissor boxes starting at index.
|
||||
*
|
||||
* \param index index of first scissor records to set
|
||||
* \param count number of scissor records to set
|
||||
* \param x, y pointer to array of struct gl_scissor_rects
|
||||
*
|
||||
* \sa glScissorArrayv().
|
||||
*
|
||||
* Verifies the parameters and call set_scissor_no_notify to do the work.
|
||||
*/
|
||||
void GLAPIENTRY
|
||||
_mesa_ScissorArrayv(GLuint first, GLsizei count, const GLint *v)
|
||||
{
|
||||
int i;
|
||||
struct gl_scissor_rect *p = (struct gl_scissor_rect *) v;
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
|
||||
if ((first + count) > ctx->Const.MaxViewports) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE,
|
||||
"glScissorArrayv: first (%d) + count (%d) >= MaxViewports (%d)",
|
||||
first, count, ctx->Const.MaxViewports);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Verify width & height */
|
||||
for (i = 0; i < count; i++) {
|
||||
if (p[i].Width < 0 || p[i].Height < 0) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE,
|
||||
"glScissorArrayv: index (%d) width or height < 0 (%d, %d)",
|
||||
i, p[i].Width, p[i].Height);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
set_scissor_no_notify(ctx, i + first,
|
||||
p[i].X, p[i].Y, p[i].Width, p[i].Height);
|
||||
|
||||
if (ctx->Driver.Scissor)
|
||||
ctx->Driver.Scissor(ctx);
|
||||
}
|
||||
|
||||
/**
|
||||
* Define the scissor box.
|
||||
*
|
||||
* \param index index of scissor records to set
|
||||
* \param x, y coordinates of the scissor box lower-left corner.
|
||||
* \param width width of the scissor box.
|
||||
* \param height height of the scissor box.
|
||||
*
|
||||
* Verifies the parameters call set_scissor_no_notify to do the work.
|
||||
*/
|
||||
static void
|
||||
ScissorIndexed(GLuint index, GLint left, GLint bottom,
|
||||
GLsizei width, GLsizei height, const char *function)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
|
||||
if (MESA_VERBOSE & VERBOSE_API)
|
||||
_mesa_debug(ctx, "%s(%d, %d, %d, %d, %d)\n",
|
||||
function, index, left, bottom, width, height);
|
||||
|
||||
if (index >= ctx->Const.MaxViewports) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE,
|
||||
"%s: index (%d) >= MaxViewports (%d)",
|
||||
function, index, ctx->Const.MaxViewports);
|
||||
return;
|
||||
}
|
||||
|
||||
if (width < 0 || height < 0) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE,
|
||||
"%s: index (%d) width or height < 0 (%d, %d)",
|
||||
function, index, width, height);
|
||||
}
|
||||
|
||||
set_scissor_no_notify(ctx, index, left, bottom, width, height);
|
||||
|
||||
if (ctx->Driver.Scissor)
|
||||
ctx->Driver.Scissor(ctx);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ScissorIndexed(GLuint index, GLint left, GLint bottom,
|
||||
GLsizei width, GLsizei height)
|
||||
{
|
||||
ScissorIndexed(index, left, bottom, width, height, "glScissorIndexd");
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ScissorIndexedv(GLuint index, const GLint *v)
|
||||
{
|
||||
ScissorIndexed(index, v[0], v[1], v[2], v[3], "glScissorIndexdv");
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the context's scissor state.
|
||||
|
|
|
|||
|
|
@ -34,6 +34,14 @@ struct gl_context;
|
|||
extern void GLAPIENTRY
|
||||
_mesa_Scissor( GLint x, GLint y, GLsizei width, GLsizei height );
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_ScissorArrayv(GLuint first, GLsizei count, const GLint * v);
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_ScissorIndexed(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height);
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_ScissorIndexedv(GLuint index, const GLint * v);
|
||||
|
||||
extern void
|
||||
_mesa_set_scissor(struct gl_context *ctx, unsigned idx,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue