mesa: add support for nvidia conservative rasterization extensions
Although the specs are written against compatibility GL 4.3 and allows core profile and GLES2+, it is exposed for GL 1.0+ and GLES1 and GLES2+. Signed-off-by: Rhys Perry <pendingchaos02@gmail.com> Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
@@ -12871,6 +12871,53 @@
|
||||
<enum name="CONSERVATIVE_RASTERIZATION_INTEL" value="0x83FE"/>
|
||||
</category>
|
||||
|
||||
<category name="GL_NV_conservative_raster" number="465">
|
||||
<enum name="CONSERVATIVE_RASTERIZATION_NV" value="0x9346">
|
||||
<size name="Get" mode="get"/>
|
||||
</enum>
|
||||
<enum name="SUBPIXEL_PRECISION_BIAS_X_BITS_NV" value="0x9347">
|
||||
<size name="Get" mode="get"/>
|
||||
</enum>
|
||||
<enum name="SUBPIXEL_PRECISION_BIAS_Y_BITS_NV" value="0x9348">
|
||||
<size name="Get" mode="get"/>
|
||||
</enum>
|
||||
<enum name="MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV" value="0x9349">
|
||||
<size name="Get" mode="get"/>
|
||||
</enum>
|
||||
<function name="SubpixelPrecisionBiasNV" es1="1.0" es2="2.0" no_error="true">
|
||||
<param name="xbits" type="GLuint"/>
|
||||
<param name="ybits" type="GLuint"/>
|
||||
</function>
|
||||
</category>
|
||||
|
||||
<category name="GL_NV_conservative_raster_dilate" number="480">
|
||||
<enum name="CONSERVATIVE_RASTER_DILATE_NV" value="0x9379">
|
||||
<size name="Get" mode="get"/>
|
||||
</enum>
|
||||
<enum name="CONSERVATIVE_RASTER_DILATE_RANGE_NV" value="0x937A">
|
||||
<size name="Get" mode="get"/>
|
||||
</enum>
|
||||
<enum name="CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV" value="0x937B">
|
||||
<size name="Get" mode="get"/>
|
||||
</enum>
|
||||
<function name="ConservativeRasterParameterfNV" es1="1.0" es2="2.0" no_error="true">
|
||||
<param name="pname" type="GLenum"/>
|
||||
<param name="param" type="GLfloat"/>
|
||||
</function>
|
||||
</category>
|
||||
|
||||
<category name="GL_NV_conservative_pre_snap_triangles" number="487">
|
||||
<enum name="CONSERVATIVE_RASTER_MODE_NV" value="0x954D">
|
||||
<size name="Get" mode="get"/>
|
||||
</enum>
|
||||
<enum name="CONSERVATIVE_RASTER_MODE_POST_SNAP_NV" value="0x954E"/>
|
||||
<enum name="CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV" value="0x954F"/>
|
||||
<function name="ConservativeRasterParameteriNV" es1="1.0" es2="2.0" no_error="true">
|
||||
<param name="pname" type="GLenum"/>
|
||||
<param name="param" type="GLint"/>
|
||||
</function>
|
||||
</category>
|
||||
|
||||
<xi:include href="INTEL_performance_query.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
|
||||
|
||||
<category name="GL_EXT_polygon_offset_clamp" number="460">
|
||||
|
@@ -62,6 +62,7 @@ header = """/**
|
||||
#include "main/colortab.h"
|
||||
#include "main/compute.h"
|
||||
#include "main/condrender.h"
|
||||
#include "main/conservativeraster.h"
|
||||
#include "main/context.h"
|
||||
#include "main/convolve.h"
|
||||
#include "main/copyimage.h"
|
||||
|
@@ -47,6 +47,8 @@ MAIN_FILES = \
|
||||
main/condrender.c \
|
||||
main/condrender.h \
|
||||
main/config.h \
|
||||
main/conservativeraster.c \
|
||||
main/conservativeraster.h \
|
||||
main/context.c \
|
||||
main/context.h \
|
||||
main/convolve.c \
|
||||
|
@@ -137,6 +137,9 @@ struct gl_enable_attrib
|
||||
|
||||
/* GL_ARB_framebuffer_sRGB / GL_EXT_framebuffer_sRGB */
|
||||
GLboolean sRGBEnabled;
|
||||
|
||||
/* GL_NV_conservative_raster */
|
||||
GLboolean ConservativeRasterization;
|
||||
};
|
||||
|
||||
|
||||
@@ -177,6 +180,13 @@ struct texture_state
|
||||
};
|
||||
|
||||
|
||||
struct viewport_state
|
||||
{
|
||||
struct gl_viewport_attrib ViewportArray[MAX_VIEWPORTS];
|
||||
GLuint SubpixelPrecisionBias[2];
|
||||
};
|
||||
|
||||
|
||||
/** An unused GL_*_BIT value */
|
||||
#define DUMMY_BIT 0x10000000
|
||||
|
||||
@@ -393,6 +403,9 @@ _mesa_PushAttrib(GLbitfield mask)
|
||||
|
||||
/* GL_ARB_framebuffer_sRGB / GL_EXT_framebuffer_sRGB */
|
||||
attr->sRGBEnabled = ctx->Color.sRGBEnabled;
|
||||
|
||||
/* GL_NV_conservative_raster */
|
||||
attr->ConservativeRasterization = ctx->ConservativeRasterization;
|
||||
}
|
||||
|
||||
if (mask & GL_EVAL_BIT) {
|
||||
@@ -544,11 +557,23 @@ _mesa_PushAttrib(GLbitfield mask)
|
||||
}
|
||||
|
||||
if (mask & GL_VIEWPORT_BIT) {
|
||||
if (!push_attrib(ctx, &head, GL_VIEWPORT_BIT,
|
||||
sizeof(struct gl_viewport_attrib)
|
||||
* ctx->Const.MaxViewports,
|
||||
(void*)&ctx->ViewportArray))
|
||||
struct viewport_state *viewstate = CALLOC_STRUCT(viewport_state);
|
||||
if (!viewstate) {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glPushAttrib(GL_VIEWPORT_BIT)");
|
||||
goto end;
|
||||
}
|
||||
|
||||
if (!save_attrib_data(&head, GL_VIEWPORT_BIT, viewstate)) {
|
||||
free(viewstate);
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glPushAttrib(GL_VIEWPORT_BIT)");
|
||||
goto end;
|
||||
}
|
||||
|
||||
memcpy(&viewstate->ViewportArray, &ctx->ViewportArray,
|
||||
sizeof(struct gl_viewport_attrib)*ctx->Const.MaxViewports);
|
||||
|
||||
viewstate->SubpixelPrecisionBias[0] = ctx->SubpixelPrecisionBias[0];
|
||||
viewstate->SubpixelPrecisionBias[1] = ctx->SubpixelPrecisionBias[1];
|
||||
}
|
||||
|
||||
/* GL_ARB_multisample */
|
||||
@@ -713,6 +738,13 @@ pop_enable_group(struct gl_context *ctx, const struct gl_enable_attrib *enable)
|
||||
TEST_AND_UPDATE(ctx->Color.sRGBEnabled, enable->sRGBEnabled,
|
||||
GL_FRAMEBUFFER_SRGB);
|
||||
|
||||
/* GL_NV_conservative_raster */
|
||||
if (ctx->Extensions.NV_conservative_raster) {
|
||||
TEST_AND_UPDATE(ctx->ConservativeRasterization,
|
||||
enable->ConservativeRasterization,
|
||||
GL_CONSERVATIVE_RASTERIZATION_NV);
|
||||
}
|
||||
|
||||
/* texture unit enables */
|
||||
for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
|
||||
const GLbitfield enabled = enable->Texture[i];
|
||||
@@ -1126,7 +1158,8 @@ _mesa_PopAttrib(void)
|
||||
ctx->DriverFlags.NewSampleAlphaToXEnable |
|
||||
ctx->DriverFlags.NewSampleMask |
|
||||
ctx->DriverFlags.NewScissorTest |
|
||||
ctx->DriverFlags.NewStencil;
|
||||
ctx->DriverFlags.NewStencil |
|
||||
ctx->DriverFlags.NewNvConservativeRasterization;
|
||||
}
|
||||
break;
|
||||
case GL_EVAL_BIT:
|
||||
@@ -1418,13 +1451,20 @@ _mesa_PopAttrib(void)
|
||||
case GL_VIEWPORT_BIT:
|
||||
{
|
||||
unsigned i;
|
||||
const struct gl_viewport_attrib *vp;
|
||||
vp = (const struct gl_viewport_attrib *) attr->data;
|
||||
const struct viewport_state *viewstate;
|
||||
viewstate = (const struct viewport_state *) attr->data;
|
||||
|
||||
for (i = 0; i < ctx->Const.MaxViewports; i++) {
|
||||
_mesa_set_viewport(ctx, i, vp[i].X, vp[i].Y, vp[i].Width,
|
||||
vp[i].Height);
|
||||
_mesa_set_depth_range(ctx, i, vp[i].Near, vp[i].Far);
|
||||
const struct gl_viewport_attrib *vp = &viewstate->ViewportArray[i];
|
||||
_mesa_set_viewport(ctx, i, vp->X, vp->Y, vp->Width,
|
||||
vp->Height);
|
||||
_mesa_set_depth_range(ctx, i, vp->Near, vp->Far);
|
||||
}
|
||||
|
||||
if (ctx->Extensions.NV_conservative_raster) {
|
||||
GLuint biasx = viewstate->SubpixelPrecisionBias[0];
|
||||
GLuint biasy = viewstate->SubpixelPrecisionBias[1];
|
||||
_mesa_SubpixelPrecisionBiasNV(biasx, biasy);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
128
src/mesa/main/conservativeraster.c
Normal file
128
src/mesa/main/conservativeraster.c
Normal file
@@ -0,0 +1,128 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
*
|
||||
* Copyright (C) 2018 Rhys Perry
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* 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 NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* \file conservativeraster.c
|
||||
* glConservativeRasterParameteriNV and glConservativeRasterParameterfNV functions
|
||||
*/
|
||||
|
||||
#include "conservativeraster.h"
|
||||
#include "context.h"
|
||||
#include "enums.h"
|
||||
|
||||
static ALWAYS_INLINE void
|
||||
conservative_raster_parameter(GLenum pname, GLfloat param,
|
||||
bool no_error, const char *func)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
|
||||
if (!no_error && !ctx->Extensions.NV_conservative_raster_dilate &&
|
||||
!ctx->Extensions.NV_conservative_raster_pre_snap_triangles) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "%s not supported", func);
|
||||
return;
|
||||
}
|
||||
|
||||
if (MESA_VERBOSE & VERBOSE_API)
|
||||
_mesa_debug(ctx, "%s(%s, %g)\n",
|
||||
func, _mesa_enum_to_string(pname), param);
|
||||
|
||||
ASSERT_OUTSIDE_BEGIN_END(ctx);
|
||||
|
||||
switch (pname) {
|
||||
case GL_CONSERVATIVE_RASTER_DILATE_NV:
|
||||
if (!no_error && !ctx->Extensions.NV_conservative_raster_dilate)
|
||||
goto invalid_pname_enum;
|
||||
|
||||
if (!no_error && param<0.0) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE, "%s(param=%g)", func, param);
|
||||
return;
|
||||
}
|
||||
ctx->ConservativeRasterDilate =
|
||||
CLAMP(param,
|
||||
ctx->Const.ConservativeRasterDilateRange[0],
|
||||
ctx->Const.ConservativeRasterDilateRange[1]);
|
||||
break;
|
||||
case GL_CONSERVATIVE_RASTER_MODE_NV:
|
||||
if (!no_error && !ctx->Extensions.NV_conservative_raster_pre_snap_triangles)
|
||||
goto invalid_pname_enum;
|
||||
|
||||
if (!no_error && param != GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV &&
|
||||
param != GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV) {
|
||||
_mesa_error(ctx, GL_INVALID_ENUM,
|
||||
"%s(pname=%s)", func, _mesa_enum_to_string(param));
|
||||
return;
|
||||
}
|
||||
ctx->ConservativeRasterMode = param;
|
||||
break;
|
||||
default:
|
||||
goto invalid_pname_enum;
|
||||
break;
|
||||
}
|
||||
|
||||
FLUSH_VERTICES(ctx, 0);
|
||||
ctx->NewDriverState |=
|
||||
ctx->DriverFlags.NewNvConservativeRasterizationParams;
|
||||
|
||||
return;
|
||||
invalid_pname_enum:
|
||||
if (!no_error)
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)",
|
||||
func, _mesa_enum_to_string(pname));
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ConservativeRasterParameteriNV_no_error(GLenum pname, GLint param)
|
||||
{
|
||||
conservative_raster_parameter(pname, param, true,
|
||||
"glConservativeRasterParameteriNV");
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ConservativeRasterParameteriNV(GLenum pname, GLint param)
|
||||
{
|
||||
conservative_raster_parameter(pname, param, false,
|
||||
"glConservativeRasterParameteriNV");
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ConservativeRasterParameterfNV_no_error(GLenum pname, GLfloat param)
|
||||
{
|
||||
conservative_raster_parameter(pname, param, true,
|
||||
"glConservativeRasterParameterfNV");
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_ConservativeRasterParameterfNV(GLenum pname, GLfloat param)
|
||||
{
|
||||
conservative_raster_parameter(pname, param, false,
|
||||
"glConservativeRasterParameterfNV");
|
||||
}
|
||||
|
||||
void
|
||||
_mesa_init_conservative_raster(struct gl_context *ctx)
|
||||
{
|
||||
ctx->ConservativeRasterDilate = 0.0;
|
||||
ctx->ConservativeRasterMode = GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV;
|
||||
}
|
48
src/mesa/main/conservativeraster.h
Normal file
48
src/mesa/main/conservativeraster.h
Normal file
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
*
|
||||
* Copyright (C) 2018 Rhys Perry
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included
|
||||
* in all copies or substantial portions of the Software.
|
||||
*
|
||||
* 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 NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef CONSERVATIVERASTER_H
|
||||
#define CONSERVATIVERASTER_H
|
||||
|
||||
#include "glheader.h"
|
||||
|
||||
struct gl_context;
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_ConservativeRasterParameteriNV_no_error(GLenum pname, GLint param);
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_ConservativeRasterParameteriNV(GLenum pname, GLint param);
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_ConservativeRasterParameterfNV_no_error(GLenum pname, GLfloat param);
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_ConservativeRasterParameterfNV(GLenum pname, GLfloat param);
|
||||
|
||||
extern void
|
||||
_mesa_init_conservative_raster(struct gl_context *ctx);
|
||||
|
||||
#endif
|
@@ -87,6 +87,7 @@
|
||||
#include "blend.h"
|
||||
#include "buffers.h"
|
||||
#include "bufferobj.h"
|
||||
#include "conservativeraster.h"
|
||||
#include "context.h"
|
||||
#include "cpuinfo.h"
|
||||
#include "debug.h"
|
||||
@@ -739,6 +740,14 @@ _mesa_init_constants(struct gl_constants *consts, gl_api api)
|
||||
consts->MaxComputeVariableGroupSize[1] = 512;
|
||||
consts->MaxComputeVariableGroupSize[2] = 64;
|
||||
consts->MaxComputeVariableGroupInvocations = 512;
|
||||
|
||||
/** GL_NV_conservative_raster */
|
||||
consts->MaxSubpixelPrecisionBiasBits = 0;
|
||||
|
||||
/** GL_NV_conservative_raster_dilate */
|
||||
consts->ConservativeRasterDilateRange[0] = 0.0;
|
||||
consts->ConservativeRasterDilateRange[0] = 0.0;
|
||||
consts->ConservativeRasterDilateGranularity = 0.0;
|
||||
}
|
||||
|
||||
|
||||
@@ -828,6 +837,7 @@ init_attrib_groups(struct gl_context *ctx)
|
||||
_mesa_init_bbox( ctx );
|
||||
_mesa_init_buffer_objects( ctx );
|
||||
_mesa_init_color( ctx );
|
||||
_mesa_init_conservative_raster( ctx );
|
||||
_mesa_init_current( ctx );
|
||||
_mesa_init_depth( ctx );
|
||||
_mesa_init_debug( ctx );
|
||||
|
@@ -488,6 +488,15 @@ typedef enum
|
||||
/* EXT_window_rectangles */
|
||||
OPCODE_WINDOW_RECTANGLES,
|
||||
|
||||
/* NV_conservative_raster */
|
||||
OPCODE_SUBPIXEL_PRECISION_BIAS,
|
||||
|
||||
/* NV_conservative_raster_dilate */
|
||||
OPCODE_CONSERVATIVE_RASTER_PARAMETER_F,
|
||||
|
||||
/* NV_conservative_raster_pre_snap_triangles */
|
||||
OPCODE_CONSERVATIVE_RASTER_PARAMETER_I,
|
||||
|
||||
/* The following three are meta instructions */
|
||||
OPCODE_ERROR, /* raise compiled-in error */
|
||||
OPCODE_CONTINUE,
|
||||
@@ -7928,6 +7937,59 @@ save_WindowRectanglesEXT(GLenum mode, GLsizei count, const GLint *box)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** GL_NV_conservative_raster */
|
||||
static void GLAPIENTRY
|
||||
save_SubpixelPrecisionBiasNV(GLuint xbits, GLuint ybits)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
Node *n;
|
||||
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
|
||||
n = alloc_instruction(ctx, OPCODE_SUBPIXEL_PRECISION_BIAS, 2);
|
||||
if (n) {
|
||||
n[1].ui = xbits;
|
||||
n[2].ui = ybits;
|
||||
}
|
||||
if (ctx->ExecuteFlag) {
|
||||
CALL_SubpixelPrecisionBiasNV(ctx->Exec, (xbits, ybits));
|
||||
}
|
||||
}
|
||||
|
||||
/** GL_NV_conservative_raster_dilate */
|
||||
static void GLAPIENTRY
|
||||
save_ConservativeRasterParameterfNV(GLenum pname, GLfloat param)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
Node *n;
|
||||
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
|
||||
n = alloc_instruction(ctx, OPCODE_CONSERVATIVE_RASTER_PARAMETER_F, 2);
|
||||
if (n) {
|
||||
n[1].e = pname;
|
||||
n[2].f = param;
|
||||
}
|
||||
if (ctx->ExecuteFlag) {
|
||||
CALL_ConservativeRasterParameterfNV(ctx->Exec, (pname, param));
|
||||
}
|
||||
}
|
||||
|
||||
/** GL_NV_conservative_raster_pre_snap_triangles */
|
||||
static void GLAPIENTRY
|
||||
save_ConservativeRasterParameteriNV(GLenum pname, GLint param)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
Node *n;
|
||||
ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
|
||||
n = alloc_instruction(ctx, OPCODE_CONSERVATIVE_RASTER_PARAMETER_I, 2);
|
||||
if (n) {
|
||||
n[1].e = pname;
|
||||
n[2].i = param;
|
||||
}
|
||||
if (ctx->ExecuteFlag) {
|
||||
CALL_ConservativeRasterParameteriNV(ctx->Exec, (pname, param));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Save an error-generating command into display list.
|
||||
*
|
||||
@@ -9137,6 +9199,21 @@ execute_list(struct gl_context *ctx, GLuint list)
|
||||
ctx->Exec, (n[1].e, n[2].si, get_pointer(&n[3])));
|
||||
break;
|
||||
|
||||
/* GL_NV_conservative_raster */
|
||||
case OPCODE_SUBPIXEL_PRECISION_BIAS:
|
||||
CALL_SubpixelPrecisionBiasNV(ctx->Exec, (n[1].ui, n[2].ui));
|
||||
break;
|
||||
|
||||
/* GL_NV_conservative_raster_dilate */
|
||||
case OPCODE_CONSERVATIVE_RASTER_PARAMETER_F:
|
||||
CALL_ConservativeRasterParameterfNV(ctx->Exec, (n[1].e, n[2].f));
|
||||
break;
|
||||
|
||||
/* GL_NV_conservative_raster_pre_snap_triangles */
|
||||
case OPCODE_CONSERVATIVE_RASTER_PARAMETER_I:
|
||||
CALL_ConservativeRasterParameteriNV(ctx->Exec, (n[1].e, n[2].i));
|
||||
break;
|
||||
|
||||
case OPCODE_CONTINUE:
|
||||
n = (Node *) get_pointer(&n[1]);
|
||||
break;
|
||||
@@ -10049,6 +10126,15 @@ _mesa_initialize_save_table(const struct gl_context *ctx)
|
||||
|
||||
/* GL_EXT_window_rectangles */
|
||||
SET_WindowRectanglesEXT(table, save_WindowRectanglesEXT);
|
||||
|
||||
/* GL_NV_conservative_raster */
|
||||
SET_SubpixelPrecisionBiasNV(table, save_SubpixelPrecisionBiasNV);
|
||||
|
||||
/* GL_NV_conservative_raster_dilate */
|
||||
SET_ConservativeRasterParameterfNV(table, save_ConservativeRasterParameterfNV);
|
||||
|
||||
/* GL_NV_conservative_raster_pre_snap_triangles */
|
||||
SET_ConservativeRasterParameteriNV(table, save_ConservativeRasterParameteriNV);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -482,6 +482,16 @@ _mesa_set_enable(struct gl_context *ctx, GLenum cap, GLboolean state)
|
||||
ctx->DriverFlags.NewIntelConservativeRasterization;
|
||||
ctx->IntelConservativeRasterization = state;
|
||||
break;
|
||||
case GL_CONSERVATIVE_RASTERIZATION_NV:
|
||||
if (!_mesa_has_NV_conservative_raster(ctx))
|
||||
goto invalid_enum_error;
|
||||
if (ctx->ConservativeRasterization == state)
|
||||
return;
|
||||
FLUSH_VERTICES(ctx, 0);
|
||||
ctx->NewDriverState |=
|
||||
ctx->DriverFlags.NewNvConservativeRasterization;
|
||||
ctx->ConservativeRasterization = state;
|
||||
break;
|
||||
case GL_COLOR_LOGIC_OP:
|
||||
if (!_mesa_is_desktop_gl(ctx) && ctx->API != API_OPENGLES)
|
||||
goto invalid_enum_error;
|
||||
@@ -1750,6 +1760,10 @@ _mesa_IsEnabled( GLenum cap )
|
||||
CHECK_EXTENSION(INTEL_conservative_rasterization);
|
||||
return ctx->IntelConservativeRasterization;
|
||||
|
||||
case GL_CONSERVATIVE_RASTERIZATION_NV:
|
||||
CHECK_EXTENSION(NV_conservative_raster);
|
||||
return ctx->ConservativeRasterization;
|
||||
|
||||
case GL_TILE_RASTER_ORDER_FIXED_MESA:
|
||||
CHECK_EXTENSION(MESA_tile_raster_order);
|
||||
return ctx->TileRasterOrderFixed;
|
||||
|
@@ -333,6 +333,10 @@ EXT(NVX_gpu_memory_info , NVX_gpu_memory_info
|
||||
|
||||
EXT(NV_blend_square , dummy_true , GLL, x , x , x , 1999)
|
||||
EXT(NV_conditional_render , NV_conditional_render , GLL, GLC, x , x , 2008)
|
||||
EXT(NV_conservative_raster , NV_conservative_raster , GLL, GLC, ES1, ES2, 2015)
|
||||
EXT(NV_conservative_raster_dilate , NV_conservative_raster_dilate , GLL, GLC, ES1, ES2, 2015)
|
||||
EXT(NV_conservative_raster_pre_snap , NV_conservative_raster_pre_snap , GLL, GLC, ES1, ES2, 2017)
|
||||
EXT(NV_conservative_raster_pre_snap_triangles, NV_conservative_raster_pre_snap_triangles, GLL, GLC, ES1, ES2, 2015)
|
||||
EXT(NV_depth_clamp , ARB_depth_clamp , GLL, GLC, x , x , 2001)
|
||||
EXT(NV_draw_buffers , dummy_true , x , x , x , ES2, 2011)
|
||||
EXT(NV_fbo_color_attachments , dummy_true , x , x , x , ES2, 2010)
|
||||
|
@@ -506,6 +506,9 @@ EXTRA_EXT(OES_primitive_bounding_box);
|
||||
EXTRA_EXT(ARB_compute_variable_group_size);
|
||||
EXTRA_EXT(KHR_robustness);
|
||||
EXTRA_EXT(ARB_sparse_buffer);
|
||||
EXTRA_EXT(NV_conservative_raster);
|
||||
EXTRA_EXT(NV_conservative_raster_dilate);
|
||||
EXTRA_EXT(NV_conservative_raster_pre_snap_triangles);
|
||||
|
||||
static const int
|
||||
extra_ARB_color_buffer_float_or_glcore[] = {
|
||||
|
@@ -355,6 +355,19 @@ descriptor=[
|
||||
# GL_ARB_robustness / GL_KHR_robustness
|
||||
[ "CONTEXT_ROBUST_ACCESS", "CONTEXT_ENUM16(Const.RobustAccess), extra_KHR_robustness" ],
|
||||
[ "RESET_NOTIFICATION_STRATEGY_ARB", "CONTEXT_ENUM16(Const.ResetStrategy), extra_KHR_robustness_or_GL" ],
|
||||
|
||||
# GL_NV_conservative_raster
|
||||
[ "SUBPIXEL_PRECISION_BIAS_X_BITS_NV", "CONTEXT_UINT(SubpixelPrecisionBias[0]), extra_NV_conservative_raster" ],
|
||||
[ "SUBPIXEL_PRECISION_BIAS_Y_BITS_NV", "CONTEXT_UINT(SubpixelPrecisionBias[1]), extra_NV_conservative_raster" ],
|
||||
[ "MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV", "CONTEXT_UINT(Const.MaxSubpixelPrecisionBiasBits), extra_NV_conservative_raster" ],
|
||||
|
||||
# GL_NV_conservative_raster_dilate
|
||||
[ "CONSERVATIVE_RASTER_DILATE_RANGE_NV", "CONTEXT_FLOAT2(Const.ConservativeRasterDilateRange), extra_NV_conservative_raster_dilate" ],
|
||||
[ "CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV", "CONTEXT_FLOAT(Const.ConservativeRasterDilateGranularity), extra_NV_conservative_raster_dilate" ],
|
||||
[ "CONSERVATIVE_RASTER_DILATE_NV", "CONTEXT_FLOAT(ConservativeRasterDilate), extra_NV_conservative_raster_dilate" ],
|
||||
|
||||
# GL_NV_conservative_raster_pre_snap_triangles
|
||||
[ "CONSERVATIVE_RASTER_MODE_NV", "CONTEXT_ENUM16(ConservativeRasterMode), extra_NV_conservative_raster_pre_snap_triangles" ],
|
||||
]},
|
||||
|
||||
# GLES3 is not a typo.
|
||||
|
@@ -3970,6 +3970,13 @@ struct gl_constants
|
||||
/** GL_ARB_get_program_binary */
|
||||
GLuint NumProgramBinaryFormats;
|
||||
|
||||
/** GL_NV_conservative_raster */
|
||||
GLuint MaxSubpixelPrecisionBiasBits;
|
||||
|
||||
/** GL_NV_conservative_raster_dilate */
|
||||
GLfloat ConservativeRasterDilateRange[2];
|
||||
GLfloat ConservativeRasterDilateGranularity;
|
||||
|
||||
/** Is the drivers uniform storage packed or padded to 16 bytes. */
|
||||
bool PackedDriverUniformStorage;
|
||||
|
||||
@@ -4187,6 +4194,10 @@ struct gl_extensions
|
||||
GLboolean NV_texture_env_combine4;
|
||||
GLboolean NV_texture_rectangle;
|
||||
GLboolean NV_vdpau_interop;
|
||||
GLboolean NV_conservative_raster;
|
||||
GLboolean NV_conservative_raster_dilate;
|
||||
GLboolean NV_conservative_raster_pre_snap_triangles;
|
||||
GLboolean NV_conservative_raster_pre_snap;
|
||||
GLboolean NVX_gpu_memory_info;
|
||||
GLboolean TDFX_texture_compression_FXT1;
|
||||
GLboolean OES_EGL_image;
|
||||
@@ -4418,6 +4429,17 @@ struct gl_driver_flags
|
||||
*/
|
||||
uint64_t NewIntelConservativeRasterization;
|
||||
|
||||
/**
|
||||
* gl_context::NvConservativeRasterization
|
||||
*/
|
||||
uint64_t NewNvConservativeRasterization;
|
||||
|
||||
/**
|
||||
* gl_context::ConservativeRasterMode/ConservativeRasterDilate
|
||||
* gl_context::SubpixelPrecisionBias
|
||||
*/
|
||||
uint64_t NewNvConservativeRasterizationParams;
|
||||
|
||||
/**
|
||||
* gl_context::Scissor::WindowRects
|
||||
*/
|
||||
@@ -4726,6 +4748,7 @@ struct gl_context
|
||||
struct gl_texture_attrib Texture; /**< Texture attributes */
|
||||
struct gl_transform_attrib Transform; /**< Transformation attributes */
|
||||
struct gl_viewport_attrib ViewportArray[MAX_VIEWPORTS]; /**< Viewport attributes */
|
||||
GLuint SubpixelPrecisionBias[2]; /**< Viewport attributes */
|
||||
/*@}*/
|
||||
|
||||
/** \name Client attribute stack */
|
||||
@@ -4906,7 +4929,10 @@ struct gl_context
|
||||
GLboolean TextureFormatSupported[MESA_FORMAT_COUNT];
|
||||
|
||||
GLboolean RasterDiscard; /**< GL_RASTERIZER_DISCARD */
|
||||
GLboolean IntelConservativeRasterization; /**< GL_INTEL_CONSERVATIVE_RASTERIZATION */
|
||||
GLboolean IntelConservativeRasterization; /**< GL_CONSERVATIVE_RASTERIZATION_INTEL */
|
||||
GLboolean ConservativeRasterization; /**< GL_CONSERVATIVE_RASTERIZATION_NV */
|
||||
GLfloat ConservativeRasterDilate;
|
||||
GLenum16 ConservativeRasterMode;
|
||||
|
||||
/** Does glVertexAttrib(0) alias glVertex()? */
|
||||
bool _AttribZeroAliasesVertex;
|
||||
|
@@ -1026,6 +1026,15 @@ const struct function common_desktop_functions_possible[] = {
|
||||
/* GL_EXT_shader_framebuffer_fetch_non_coherent */
|
||||
{ "glFramebufferFetchBarrierEXT", 20, -1 },
|
||||
|
||||
/* GL_NV_conservative_raster */
|
||||
{ "glSubpixelPrecisionBiasNV", 10, -1 },
|
||||
|
||||
/* GL_NV_conservative_raster_dilate */
|
||||
{ "glConservativeRasterParameterfNV", 10, -1 },
|
||||
|
||||
/* GL_NV_conservative_raster_pre_snap_triangles */
|
||||
{ "glConservativeRasterParameteriNV", 10, -1 },
|
||||
|
||||
{ NULL, 0, -1 }
|
||||
};
|
||||
|
||||
@@ -2185,6 +2194,15 @@ const struct function gles11_functions_possible[] = {
|
||||
/* GL_EXT_polygon_offset_clamp */
|
||||
{ "glPolygonOffsetClampEXT", 11, -1 },
|
||||
|
||||
/* GL_NV_conservative_raster */
|
||||
{ "glSubpixelPrecisionBiasNV", 20, -1 },
|
||||
|
||||
/* GL_NV_conservative_raster_dilate */
|
||||
{ "glConservativeRasterParameterfNV", 20, -1 },
|
||||
|
||||
/* GL_NV_conservative_raster_pre_snap_triangles */
|
||||
{ "glConservativeRasterParameteriNV", 20, -1 },
|
||||
|
||||
{ NULL, 0, -1 }
|
||||
};
|
||||
|
||||
@@ -2452,6 +2470,15 @@ const struct function gles2_functions_possible[] = {
|
||||
/* GL_EXT_shader_framebuffer_fetch_non_coherent */
|
||||
{ "glFramebufferFetchBarrierEXT", 20, -1 },
|
||||
|
||||
/* GL_NV_conservative_raster */
|
||||
{ "glSubpixelPrecisionBiasNV", 20, -1 },
|
||||
|
||||
/* GL_NV_conservative_raster_dilate */
|
||||
{ "glConservativeRasterParameterfNV", 20, -1 },
|
||||
|
||||
/* GL_NV_conservative_raster_pre_snap_triangles */
|
||||
{ "glConservativeRasterParameteriNV", 20, -1 },
|
||||
|
||||
{ NULL, 0, -1 }
|
||||
};
|
||||
|
||||
|
@@ -489,6 +489,9 @@ void _mesa_init_viewport(struct gl_context *ctx)
|
||||
ctx->ViewportArray[i].Near = 0.0;
|
||||
ctx->ViewportArray[i].Far = 1.0;
|
||||
}
|
||||
|
||||
ctx->SubpixelPrecisionBias[0] = 0;
|
||||
ctx->SubpixelPrecisionBias[1] = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -599,3 +602,58 @@ _mesa_get_viewport_xform(struct gl_context *ctx, unsigned i,
|
||||
translate[2] = n;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
subpixel_precision_bias(struct gl_context *ctx, GLuint xbits, GLuint ybits)
|
||||
{
|
||||
if (MESA_VERBOSE & VERBOSE_API)
|
||||
_mesa_debug(ctx, "glSubpixelPrecisionBiasNV(%u, %u)\n", xbits, ybits);
|
||||
|
||||
ctx->SubpixelPrecisionBias[0] = xbits;
|
||||
ctx->SubpixelPrecisionBias[1] = ybits;
|
||||
|
||||
FLUSH_VERTICES(ctx, 0);
|
||||
ctx->NewDriverState |=
|
||||
ctx->DriverFlags.NewNvConservativeRasterizationParams;
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_SubpixelPrecisionBiasNV_no_error(GLuint xbits, GLuint ybits)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
|
||||
if (MESA_VERBOSE & VERBOSE_API)
|
||||
_mesa_debug(ctx, "glSubpixelPrecisionBiasNV(%u, %u)\n", xbits, ybits);
|
||||
|
||||
subpixel_precision_bias(ctx, xbits, ybits);
|
||||
}
|
||||
|
||||
void GLAPIENTRY
|
||||
_mesa_SubpixelPrecisionBiasNV(GLuint xbits, GLuint ybits)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
|
||||
if (MESA_VERBOSE & VERBOSE_API)
|
||||
_mesa_debug(ctx, "glSubpixelPrecisionBiasNV(%u, %u)\n", xbits, ybits);
|
||||
|
||||
ASSERT_OUTSIDE_BEGIN_END(ctx);
|
||||
|
||||
if (!ctx->Extensions.NV_conservative_raster) {
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glSubpixelPrecisionBiasNV not supported");
|
||||
return;
|
||||
}
|
||||
|
||||
if (xbits > ctx->Const.MaxSubpixelPrecisionBiasBits) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE, "glSubpixelPrecisionBiasNV");
|
||||
return;
|
||||
}
|
||||
|
||||
if (ybits > ctx->Const.MaxSubpixelPrecisionBiasBits) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE, "glSubpixelPrecisionBiasNV");
|
||||
return;
|
||||
}
|
||||
|
||||
subpixel_precision_bias(ctx, xbits, ybits);
|
||||
}
|
||||
|
@@ -104,4 +104,10 @@ extern void
|
||||
_mesa_get_viewport_xform(struct gl_context *ctx, unsigned i,
|
||||
float scale[3], float translate[3]);
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_SubpixelPrecisionBiasNV_no_error(GLuint xbits, GLuint ybits);
|
||||
|
||||
extern void GLAPIENTRY
|
||||
_mesa_SubpixelPrecisionBiasNV(GLuint xbits, GLuint ybits);
|
||||
|
||||
#endif
|
||||
|
@@ -96,6 +96,8 @@ files_libmesa_common = files(
|
||||
'main/condrender.c',
|
||||
'main/condrender.h',
|
||||
'main/config.h',
|
||||
'main/conservativeraster.c',
|
||||
'main/conservativeraster.h',
|
||||
'main/context.c',
|
||||
'main/context.h',
|
||||
'main/convolve.c',
|
||||
|
Reference in New Issue
Block a user