[Mesa-dev] [PATCH 1/5] mesa: add support for ARB_sample_locations
Marek Olšák
maraeo at gmail.com
Wed May 9 01:51:50 UTC 2018
On Fri, May 4, 2018 at 8:09 AM, Rhys Perry <pendingchaos02 at gmail.com> wrote:
> Signed-off-by: Rhys Perry <pendingchaos02 at gmail.com>
> ---
> src/mapi/glapi/gen/gl_API.xml | 52 +++++++
> src/mesa/main/config.h | 7 +
> src/mesa/main/dd.h | 7 +
> src/mesa/main/extensions_table.h | 1 +
> src/mesa/main/fbobject.c | 247
> ++++++++++++++++++++++++++++----
> src/mesa/main/fbobject.h | 20 +++
> src/mesa/main/framebuffer.c | 10 ++
> src/mesa/main/get.c | 32 +++++
> src/mesa/main/get_hash_params.py | 6 +
> src/mesa/main/mtypes.h | 6 +
> src/mesa/main/multisample.c | 18 +++
> src/mesa/main/tests/dispatch_sanity.cpp | 10 ++
> 12 files changed, 386 insertions(+), 30 deletions(-)
>
> diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
> index 38c1921047..a23094a548 100644
> --- a/src/mapi/glapi/gen/gl_API.xml
> +++ b/src/mapi/glapi/gen/gl_API.xml
> @@ -10891,6 +10891,58 @@
>
> <!-- Extension number 180 is not listed in the extension registry. -->
>
> +<category name="GL_ARB_sample_locations" number="181">
> + <enum name="SAMPLE_LOCATION_SUBPIXEL_BITS_ARB"
> value="0x933D">
> + <size name="Get" mode="get"/>
> + </enum>
> +
> + <enum name="SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB"
> value="0x933E">
> + <size name="Get" mode="get"/>
> + </enum>
> +
> + <enum name="SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB"
> value="0x933F">
> + <size name="Get" mode="get"/>
> + </enum>
> +
> + <enum name="PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB"
> value="0x9340">
> + <size name="Get" mode="get"/>
> + </enum>
> +
> + <enum name="SAMPLE_LOCATION_ARB"
> value="0x8E50">
> + <size name="GetMultisamplefv" mode="get"/>
> + </enum>
> +
> + <enum name="PROGRAMMABLE_SAMPLE_LOCATION_ARB"
> value="0x9341">
> + <size name="GetMultisamplefv" mode="get"/>
> + </enum>
> +
> + <enum name="FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB"
> value="0x9342">
> + <size name="FramebufferParameteri"/>
> + <size name="GetFramebufferParameteri"/>
> + </enum>
> +
> + <enum name="FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB"
> value="0x9343">
> + <size name="FramebufferParameteri"/>
> + <size name="GetFramebufferParameteri"/>
> + </enum>
> +
> + <function name="FramebufferSampleLocationsfvARB" no_error="true"
> es2="3.1">
> + <param name="target" type="GLenum"/>
> + <param name="start" type="GLuint"/>
> + <param name="count" type="GLsizei"/>
> + <param name="v" type="const GLfloat *"/>
> + </function>
> +
> + <function name="NamedFramebufferSampleLocationsfvARB"
> no_error="true" es2="3.1">
> + <param name="framebuffer" type="GLuint"/>
> + <param name="start" type="GLuint"/>
> + <param name="count" type="GLsizei"/>
> + <param name="v" type="const GLfloat *"/>
> + </function>
> +
> + <function name="EvaluateDepthValuesARB" es2="3.1"/>
> +</category>
> +
> <category name="GL_SUN_convolution_border_modes" number="182">
> <enum name="WRAP_BORDER_SUN" value="0x81D4"/>
> </category>
> diff --git a/src/mesa/main/config.h b/src/mesa/main/config.h
> index 81573bfbf2..444e4dedad 100644
> --- a/src/mesa/main/config.h
> +++ b/src/mesa/main/config.h
> @@ -315,4 +315,11 @@
> #define MAX_CLIPPED_VERTICES ((2 * (6 + MAX_CLIP_PLANES))+1)
>
>
> +/** For GL_ARB_sample_locations - maximum of SAMPLE_LOCATION_PIXEL_GRID_*_ARB
> */
> +#define MAX_SAMPLE_LOCATION_GRID_SIZE 4
> +/* It is theoretically possible for Consts.MaxSamples to be >32 but
> + * other code seems to assume that is not the case */
> +#define MAX_SAMPLE_LOCATION_TABLE_SIZE \
> + (MAX_SAMPLE_LOCATION_GRID_SIZE*MAX_SAMPLE_LOCATION_GRID_SIZE*32)
> +
> #endif /* MESA_CONFIG_H_INCLUDED */
> diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
> index d85d89ef50..8929a2e267 100644
> --- a/src/mesa/main/dd.h
> +++ b/src/mesa/main/dd.h
> @@ -785,6 +785,13 @@ struct dd_function_table {
> GLenum target, GLsizei numAttachments,
> const GLenum *attachments);
>
> + /**
> + * \name Functions for GL_ARB_sample_locations
> + */
> + void (*GetProgrammableSampleCaps)(struct gl_context *ctx, struct
> gl_framebuffer *fb,
> + GLuint *bits, GLuint *width, GLuint
> *height);
> + void (*EvaluateDepthValues)(struct gl_context *ctx, struct
> gl_framebuffer *fb);
> +
> /**
> * \name Query objects
> */
> diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_
> table.h
> index 492f7c3d20..3497cbea0e 100644
> --- a/src/mesa/main/extensions_table.h
> +++ b/src/mesa/main/extensions_table.h
> @@ -103,6 +103,7 @@ EXT(ARB_provoking_vertex ,
> EXT_provoking_vertex
> EXT(ARB_query_buffer_object , ARB_query_buffer_object
> , GLL, GLC, x , x , 2013)
> EXT(ARB_robust_buffer_access_behavior , ARB_robust_buffer_access_behavior
> , GLL, GLC, x , x , 2012)
> EXT(ARB_robustness , dummy_true
> , GLL, GLC, x , x , 2010)
> +EXT(ARB_sample_locations , ARB_sample_locations
> , GLL, GLC, x , ES2, 2015)
> EXT(ARB_sample_shading , ARB_sample_shading
> , GLL, GLC, x , x , 2009)
> EXT(ARB_sampler_objects , dummy_true
> , GLL, GLC, x , x , 2009)
> EXT(ARB_seamless_cube_map , ARB_seamless_cube_map
> , GLL, GLC, x , x , 2009)
> diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
> index c72204e11a..33d7f0307d 100644
> --- a/src/mesa/main/fbobject.c
> +++ b/src/mesa/main/fbobject.c
> @@ -35,6 +35,7 @@
>
> #include "buffers.h"
> #include "context.h"
> +#include "debug_output.h"
> #include "enums.h"
> #include "fbobject.h"
> #include "formats.h"
> @@ -1403,15 +1404,57 @@ _mesa_BindRenderbufferEXT(GLenum target, GLuint
> renderbuffer)
> bind_renderbuffer(target, renderbuffer, true);
> }
>
> +static bool
> +_pname_writable_for_default_framebuffer(struct gl_context *ctx,
> + GLenum pname)
> +{
> + switch (pname) {
> + case GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB:
> + case GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB:
> + return true;
> + default:
> + return false;
> + }
> +}
> +
> /**
> - * ARB_framebuffer_no_attachment - Application passes requested param's
> - * here. NOTE: NumSamples requested need not be _NumSamples which is
> - * what the hw supports.
> + * ARB_framebuffer_no_attachment and ARB_sample_locations - Application
> passes
> + * requested param's here. NOTE: NumSamples requested need not be
> _NumSamples
> + * which is what the hw supports.
> */
> static void
> framebuffer_parameteri(struct gl_context *ctx, struct gl_framebuffer *fb,
> GLenum pname, GLint param, const char *func)
> {
> + switch (pname) {
> + case GL_FRAMEBUFFER_DEFAULT_WIDTH:
> + case GL_FRAMEBUFFER_DEFAULT_HEIGHT:
> + case GL_FRAMEBUFFER_DEFAULT_LAYERS:
> + case GL_FRAMEBUFFER_DEFAULT_SAMPLES:
> + case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
> + if (!ctx->Extensions.ARB_framebuffer_no_attachments)
> + goto invalid_pname_enum;
> + break;
> + case GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB:
> + case GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB:
> + if (!ctx->Extensions.ARB_sample_locations)
> + goto invalid_pname_enum;
> + break;
> + default:
> + goto invalid_pname_enum;
> + }
> +
> + if (_mesa_is_winsys_fbo(fb) &&
> + !_pname_writable_for_default_framebuffer(ctx, pname)) {
> + if (ctx->Extensions.ARB_sample_locations)
> + _mesa_error(ctx, GL_INVALID_OPERATION,
> + "%s(invalid pname=0x%x for default framebuffer)",
> func, pname);
> + else
> + _mesa_error(ctx, GL_INVALID_OPERATION,
> + "%s(default framebuffer used)", func);
> + return;
> + }
> +
> switch (pname) {
> case GL_FRAMEBUFFER_DEFAULT_WIDTH:
> if (param < 0 || param > ctx->Const.MaxFramebufferWidth)
> @@ -1448,13 +1491,29 @@ framebuffer_parameteri(struct gl_context *ctx,
> struct gl_framebuffer *fb,
> case GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS:
> fb->DefaultGeometry.FixedSampleLocations = param;
> break;
> - default:
> - _mesa_error(ctx, GL_INVALID_ENUM,
> - "%s(pname=0x%x)", func, pname);
> + case GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB:
> + fb->ProgrammableSampleLocations = param;
> + break;
> + case GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB:
> + fb->SampleLocationPixelGrid = param;
> + break;
> }
>
> - invalidate_framebuffer(fb);
> + switch (pname) {
> + case GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB:
> + case GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB:
> + break;
> + default:
> + invalidate_framebuffer(fb);
> + break;
> + }
> ctx->NewState |= _NEW_BUFFERS;
> +
> + return;
> +
> +invalid_pname_enum:
> + _mesa_error(ctx, GL_INVALID_ENUM,
> + "%s(pname=0x%x)", func, pname);
> }
>
> void GLAPIENTRY
> @@ -1463,10 +1522,10 @@ _mesa_FramebufferParameteri(GLenum target, GLenum
> pname, GLint param)
> GET_CURRENT_CONTEXT(ctx);
> struct gl_framebuffer *fb;
>
> - if (!ctx->Extensions.ARB_framebuffer_no_attachments) {
> + if (!ctx->Extensions.ARB_framebuffer_no_attachments &&
> !ctx->Extensions.ARB_sample_locations) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> "glFramebufferParameteriv not supported "
> - "(ARB_framebuffer_no_attachments not implemented)");
> + "(ARB_framebuffer_no_attachments or
> ARB_sample_locations not implemented)");
> return;
> }
>
> @@ -1477,23 +1536,13 @@ _mesa_FramebufferParameteri(GLenum target, GLenum
> pname, GLint param)
> return;
> }
>
> - /* check framebuffer binding */
> - if (_mesa_is_winsys_fbo(fb)) {
> - _mesa_error(ctx, GL_INVALID_OPERATION,
> - "glFramebufferParameteri");
> - return;
> - }
> -
> framebuffer_parameteri(ctx, fb, pname, param,
> "glFramebufferParameteri");
> }
>
> static bool
> -_pname_valid_for_default_framebuffer(struct gl_context *ctx,
> - GLenum pname)
> +_pname_readable_for_default_framebuffer(struct gl_context *ctx,
> + GLenum pname)
> {
> - if (!_mesa_is_desktop_gl(ctx))
> - return false;
> -
> switch (pname) {
> case GL_DOUBLEBUFFER:
> case GL_IMPLEMENTATION_COLOR_READ_FORMAT:
> @@ -1501,6 +1550,9 @@ _pname_valid_for_default_framebuffer(struct
> gl_context *ctx,
> case GL_SAMPLES:
> case GL_SAMPLE_BUFFERS:
> case GL_STEREO:
> + return _mesa_is_desktop_gl(ctx);
> + case GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB:
> + case GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB:
> return true;
> default:
> return false;
> @@ -1519,10 +1571,10 @@ get_framebuffer_parameteriv(struct gl_context
> *ctx, struct gl_framebuffer *fb,
> * SAMPLE_POSITION."
> *
> * For OpenGL ES, using default framebuffer still raises
> INVALID_OPERATION
> - * for any pname.
> + * for any pname other than the ARB_sample_location names.
> */
> if (_mesa_is_winsys_fbo(fb) &&
> - !_pname_valid_for_default_framebuffer(ctx, pname)) {
> + !_pname_readable_for_default_framebuffer(ctx, pname)) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> "%s(invalid pname=0x%x for default framebuffer)", func,
> pname);
> return;
> @@ -1570,6 +1622,20 @@ get_framebuffer_parameteriv(struct gl_context
> *ctx, struct gl_framebuffer *fb,
> case GL_STEREO:
> *params = fb->Visual.stereoMode;
> break;
> + case GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB:
> + if (!ctx->Extensions.ARB_sample_locations) {
> + _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
> + break;
> + }
> + *params = fb->ProgrammableSampleLocations;
> + break;
> + case GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB:
> + if (!ctx->Extensions.ARB_sample_locations) {
> + _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", func, pname);
> + break;
> + }
> + *params = fb->SampleLocationPixelGrid;
> + break;
> default:
> _mesa_error(ctx, GL_INVALID_ENUM,
> "%s(pname=0x%x)", func, pname);
> @@ -1582,10 +1648,12 @@ _mesa_GetFramebufferParameteriv(GLenum target,
> GLenum pname, GLint *params)
> GET_CURRENT_CONTEXT(ctx);
> struct gl_framebuffer *fb;
>
> - if (!ctx->Extensions.ARB_framebuffer_no_attachments) {
> + if (!ctx->Extensions.ARB_framebuffer_no_attachments &&
> + !ctx->Extensions.ARB_sample_locations) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> "glGetFramebufferParameteriv not supported "
> - "(ARB_framebuffer_no_attachments not implemented)");
> + "(both ARB_framebuffer_no_attachments and
> ARB_sample_locations"
> + " not implemented)");
> return;
> }
>
> @@ -4224,15 +4292,21 @@ _mesa_NamedFramebufferParameteri(GLuint
> framebuffer, GLenum pname,
> GET_CURRENT_CONTEXT(ctx);
> struct gl_framebuffer *fb = NULL;
>
> - if (!ctx->Extensions.ARB_framebuffer_no_attachments) {
> + if (!ctx->Extensions.ARB_framebuffer_no_attachments &&
> + !ctx->Extensions.ARB_sample_locations) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> "glNamedFramebufferParameteri("
> - "ARB_framebuffer_no_attachments not implemented)");
> + "both ARB_framebuffer_no_attachments and "
> + "ARB_sample_locations not implemented)");
> return;
> }
>
> - fb = _mesa_lookup_framebuffer_err(ctx, framebuffer,
> - "glNamedFramebufferParameteri");
> + if (framebuffer) {
> + fb = _mesa_lookup_framebuffer_err(ctx, framebuffer,
> + "glNamedFramebufferParameteri");
> + } else {
> + fb = ctx->WinSysDrawBuffer;
> + }
>
> if (fb) {
> framebuffer_parameteri(ctx, fb, pname, param,
> @@ -4251,7 +4325,8 @@ _mesa_GetNamedFramebufferParameteriv(GLuint
> framebuffer, GLenum pname,
> if (!ctx->Extensions.ARB_framebuffer_no_attachments) {
> _mesa_error(ctx, GL_INVALID_OPERATION,
> "glNamedFramebufferParameteriv("
> - "ARB_framebuffer_no_attachments not implemented)");
> + "both ARB_framebuffer_no_attachments and
> ARB_sample_locations"
> + " not implemented)");
> return;
> }
>
> @@ -4595,3 +4670,115 @@ invalid_enum:
> "glDiscardFramebufferEXT(attachment %s)",
> _mesa_enum_to_string(attachments[i]));
> }
> +
> +static void
> +sample_locations(struct gl_context *ctx, struct gl_framebuffer *fb,
> + GLuint start, GLsizei count, const GLfloat *v, bool
> no_error,
> + const char *name)
> +{
> + GLsizei i;
> +
> + if (!no_error && !ctx->Extensions.ARB_sample_locations) {
> + _mesa_error(ctx, GL_INVALID_OPERATION,
> + "%s not supported "
> + "(ARB_sample_locations not implemented)", name);
> + return;
> + }
> +
> + if (!no_error && start+count>MAX_SAMPLE_LOCATION_TABLE_SIZE) {
> + _mesa_error(ctx, GL_INVALID_VALUE,
> + "%s(start+size > sample location table size)", name);
> + return;
> + }
> +
> + if (!fb->SampleLocationTable) {
> + size_t size = MAX_SAMPLE_LOCATION_TABLE_SIZE * 2 * sizeof(GLfloat);
> + fb->SampleLocationTable = malloc(size);
> + for (i = 0; i < MAX_SAMPLE_LOCATION_TABLE_SIZE * 2; i++)
> + fb->SampleLocationTable[i] = 0.5f;
> + }
> +
> + for (i = 0; i < count * 2; i++) {
> + if (v[i] != v[i] || v[i] < 0.0 || v[i] > 1.0) {
> + static GLuint msg_id = 0;
> + static const char* msg = "Invalid sample location specified";
> + _mesa_debug_get_id(&msg_id);
> +
> + fb->SampleLocationTable[start * 2 + i] = CLAMP(v[i], 0.0, 1.0);
> + _mesa_log_msg(ctx, MESA_DEBUG_SOURCE_API,
> MESA_DEBUG_TYPE_UNDEFINED,
> + msg_id, MESA_DEBUG_SEVERITY_HIGH, strlen(msg),
> msg);
> + } else
> + fb->SampleLocationTable[start * 2 + i] = v[i];
> + }
> +
> + ctx->NewState |= _NEW_BUFFERS;
>
I wouldn't like to see _NEW_* being used for anything new. _NEW_BUFFERS
implies a memory and execution barrier in gallium, so it decreases
performance.
gl_driver_flags provides a more efficient mechanism for communicating state
changes to drivers. A new flag in that structure is highly preferred.
Marek
> +}
> +
> +void GLAPIENTRY
> +_mesa_FramebufferSampleLocationsfvARB(GLenum target, GLuint start,
> + GLsizei count, const GLfloat *v)
> +{
> + struct gl_framebuffer *fb;
> +
> + GET_CURRENT_CONTEXT(ctx);
> +
> + fb = get_framebuffer_target(ctx, target);
> + if (!fb) {
> + _mesa_error(ctx, GL_INVALID_ENUM,
> + "glFramebufferSampleLocationsfvARB(target %s)",
> + _mesa_enum_to_string(target));
> + return;
> + }
> +
> + sample_locations(ctx, fb, start, count, v, false,
> + "glFramebufferSampleLocationsfvARB");
> +}
> +
> +void GLAPIENTRY
> +_mesa_NamedFramebufferSampleLocationsfvARB(GLuint framebuffer, GLuint
> start,
> + GLsizei count, const GLfloat
> *v)
> +{
> + struct gl_framebuffer *fb;
> +
> + GET_CURRENT_CONTEXT(ctx);
> +
> + if (framebuffer) {
> + fb = _mesa_lookup_framebuffer_err(ctx, framebuffer,
> + "glNamedFramebufferSampleLocati
> onsfvARB");
> + if (!fb)
> + return;
> + }
> + else
> + fb = ctx->WinSysDrawBuffer;
> +
> + sample_locations(ctx, fb, start, count, v, false,
> + "glNamedFramebufferSampleLocationsfvARB");
> +}
> +
> +void GLAPIENTRY
> +_mesa_FramebufferSampleLocationsfvARB_no_error(GLenum target, GLuint
> start,
> + GLsizei count, const
> GLfloat *v)
> +{
> + GET_CURRENT_CONTEXT(ctx);
> +
> + sample_locations(ctx, get_framebuffer_target(ctx, target), start,
> + count, v, true, "glFramebufferSampleLocationsfvARB");
> +}
> +
> +void GLAPIENTRY
> +_mesa_NamedFramebufferSampleLocationsfvARB_no_error(GLuint framebuffer,
> + GLuint start, GLsizei
> count,
> + const GLfloat *v)
> +{
> + GET_CURRENT_CONTEXT(ctx);
> + sample_locations(ctx, _mesa_lookup_framebuffer(ctx, framebuffer),
> start,
> + count, v, true, "glNamedFramebufferSampleLocati
> onsfvARB");
> +}
> +
> +void GLAPIENTRY
> +_mesa_EvaluateDepthValuesARB(void)
> +{
> + GET_CURRENT_CONTEXT(ctx);
> + if (ctx->Driver.EvaluateDepthValues)
> + ctx->Driver.EvaluateDepthValues(ctx, ctx->DrawBuffer);
> +}
> diff --git a/src/mesa/main/fbobject.h b/src/mesa/main/fbobject.h
> index 31d743d3fb..5ba62d6cb1 100644
> --- a/src/mesa/main/fbobject.h
> +++ b/src/mesa/main/fbobject.h
> @@ -355,4 +355,24 @@ _mesa_FramebufferParameteri(GLenum target, GLenum
> pname, GLint param);
> extern void GLAPIENTRY
> _mesa_GetFramebufferParameteriv(GLenum target, GLenum pname, GLint
> *params);
>
> +extern void GLAPIENTRY
> +_mesa_FramebufferSampleLocationsfvARB(GLenum target, GLuint start,
> + GLsizei count, const GLfloat *v);
> +
> +extern void GLAPIENTRY
> +_mesa_NamedFramebufferSampleLocationsfvARB(GLuint framebuffer, GLuint
> start,
> + GLsizei count, const GLfloat
> *v);
> +
> +extern void GLAPIENTRY
> +_mesa_FramebufferSampleLocationsfvARB_no_error(GLenum target, GLuint
> start,
> + GLsizei count, const
> GLfloat *v);
> +
> +extern void GLAPIENTRY
> +_mesa_NamedFramebufferSampleLocationsfvARB_no_error(GLuint framebuffer,
> + GLuint start, GLsizei
> count,
> + const GLfloat *v);
> +
> +extern void GLAPIENTRY
> +_mesa_EvaluateDepthValuesARB(void);
> +
> #endif /* FBOBJECT_H */
> diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c
> index 249e775f8c..02f84dca75 100644
> --- a/src/mesa/main/framebuffer.c
> +++ b/src/mesa/main/framebuffer.c
> @@ -160,6 +160,10 @@ _mesa_initialize_window_framebuffer(struct
> gl_framebuffer *fb,
> fb->_HasSNormOrFloatColorBuffer = visual->floatMode;
> fb->_HasAttachments = true;
>
> + fb->SampleLocationTable = NULL;
> + fb->ProgrammableSampleLocations = 0;
> + fb->SampleLocationPixelGrid = 0;
> +
> compute_depth_max(fb);
> }
>
> @@ -183,6 +187,9 @@ _mesa_initialize_user_framebuffer(struct
> gl_framebuffer *fb, GLuint name)
> fb->_ColorDrawBufferIndexes[0] = BUFFER_COLOR0;
> fb->ColorReadBuffer = GL_COLOR_ATTACHMENT0_EXT;
> fb->_ColorReadBufferIndex = BUFFER_COLOR0;
> + fb->SampleLocationTable = NULL;
> + fb->ProgrammableSampleLocations = 0;
> + fb->SampleLocationPixelGrid = 0;
> fb->Delete = _mesa_destroy_framebuffer;
> simple_mtx_init(&fb->Mutex, mtx_plain);
> }
> @@ -229,6 +236,9 @@ _mesa_free_framebuffer_data(struct gl_framebuffer *fb)
> assert(!att->Texture);
> att->Type = GL_NONE;
> }
> +
> + free(fb->SampleLocationTable);
> + fb->SampleLocationTable = NULL;
> }
>
>
> diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
> index 90ab7ca60f..2a43937ec3 100644
> --- a/src/mesa/main/get.c
> +++ b/src/mesa/main/get.c
> @@ -188,6 +188,7 @@ union value {
> GLint value_int_4[4];
> GLint64 value_int64;
> GLenum value_enum;
> + GLuint value_uint;
>
> /* Sigh, see GL_COMPRESSED_TEXTURE_FORMATS_ARB handling */
> struct {
> @@ -506,6 +507,7 @@ EXTRA_EXT(OES_primitive_bounding_box);
> EXTRA_EXT(ARB_compute_variable_group_size);
> EXTRA_EXT(KHR_robustness);
> EXTRA_EXT(ARB_sparse_buffer);
> +EXTRA_EXT(ARB_sample_locations);
>
> static const int
> extra_ARB_color_buffer_float_or_glcore[] = {
> @@ -1187,6 +1189,36 @@ find_custom_value(struct gl_context *ctx, const
> struct value_desc *d, union valu
> simple_mtx_unlock(&ctx->Shared->Mutex);
> }
> break;
> + /* GL_ARB_sample_locations */
> + case GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB:
> + case GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB:
> + case GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB:
> + {
> + GLuint bits=0, width=1, height=1;
> +
> + if (ctx->NewState & _NEW_BUFFERS)
> + _mesa_update_state(ctx);
> +
> + if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE) {
> + v->value_uint = 0;
> + break;
> + }
> +
> + if (ctx->Driver.GetProgrammableSampleCaps)
> + ctx->Driver.GetProgrammableSampleCaps(ctx, ctx->DrawBuffer,
> + &bits, &width, &height);
> +
> + if (d->pname == GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB)
> + v->value_uint = width;
> + else if (d->pname == GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB)
> + v->value_uint = height;
> + else
> + v->value_uint = bits;
> + }
> + break;
> + case GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB:
> + v->value_uint = MAX_SAMPLE_LOCATION_TABLE_SIZE;
> + break;
> }
> }
>
> diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_
> params.py
> index f38a87df88..eba68a6321 100644
> --- a/src/mesa/main/get_hash_params.py
> +++ b/src/mesa/main/get_hash_params.py
> @@ -545,6 +545,12 @@ descriptor=[
>
> # GL_NUM_SHADING_LANGUAGE_VERSIONS
> [ "NUM_SHADING_LANGUAGE_VERSIONS", "LOC_CUSTOM, TYPE_INT, 0,
> extra_version_43" ],
> +
> + # GL_ARB_sample_locations
> + [ "SAMPLE_LOCATION_SUBPIXEL_BITS_ARB", "LOC_CUSTOM, TYPE_UINT, 0,
> extra_ARB_sample_locations" ],
> + [ "SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB", "LOC_CUSTOM, TYPE_UINT, 0,
> extra_ARB_sample_locations" ],
> + [ "SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB", "LOC_CUSTOM, TYPE_UINT, 0,
> extra_ARB_sample_locations" ],
> + [ "PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB", "LOC_CUSTOM,
> TYPE_UINT, 0, extra_ARB_sample_locations" ],
> ]},
>
> # Enums in OpenGL Core profile and ES 3.0
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index b65e7b2c3c..1feb3a658a 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -3441,6 +3441,11 @@ struct gl_framebuffer
> GLenum16 ColorDrawBuffer[MAX_DRAW_BUFFERS];
> GLenum16 ColorReadBuffer;
>
> + /* GL_ARB_sample_locations */
> + GLfloat* SampleLocationTable; /**< If NULL, no table has been
> specified */
> + GLint ProgrammableSampleLocations;
> + GLint SampleLocationPixelGrid;
> +
> /** Computed from ColorDraw/ReadBuffer above */
> GLuint _NumColorDrawBuffers;
> gl_buffer_index _ColorDrawBufferIndexes[MAX_DRAW_BUFFERS];
> @@ -4043,6 +4048,7 @@ struct gl_extensions
> GLboolean ARB_post_depth_coverage;
> GLboolean ARB_query_buffer_object;
> GLboolean ARB_robust_buffer_access_behavior;
> + GLboolean ARB_sample_locations;
> GLboolean ARB_sample_shading;
> GLboolean ARB_seamless_cube_map;
> GLboolean ARB_shader_atomic_counter_ops;
> diff --git a/src/mesa/main/multisample.c b/src/mesa/main/multisample.c
> index dfe6a37142..08f6acb7e1 100644
> --- a/src/mesa/main/multisample.c
> +++ b/src/mesa/main/multisample.c
> @@ -101,6 +101,24 @@ _mesa_GetMultisamplefv(GLenum pname, GLuint index,
> GLfloat * val)
> return;
> }
>
> + case GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB:
> + if (!ctx->Extensions.ARB_sample_locations) {
> + _mesa_error( ctx, GL_INVALID_ENUM, "glGetMultisamplefv(pname)" );
> + return;
> + }
> +
> + if (index >= MAX_SAMPLE_LOCATION_TABLE_SIZE*2) {
> + _mesa_error( ctx, GL_INVALID_VALUE, "glGetMultisamplefv(index)"
> );
> + return;
> + }
> +
> + if (ctx->DrawBuffer->SampleLocationTable)
> + *val = ctx->DrawBuffer->SampleLocationTable[index];
> + else
> + *val = 0.5f;
> +
> + return;
> +
> default:
> _mesa_error( ctx, GL_INVALID_ENUM, "glGetMultisamplefv(pname)" );
> return;
> diff --git a/src/mesa/main/tests/dispatch_sanity.cpp
> b/src/mesa/main/tests/dispatch_sanity.cpp
> index 83a4b04654..884f0c2e8c 100644
> --- a/src/mesa/main/tests/dispatch_sanity.cpp
> +++ b/src/mesa/main/tests/dispatch_sanity.cpp
> @@ -1026,6 +1026,11 @@ const struct function common_desktop_functions_possible[]
> = {
> /* GL_EXT_shader_framebuffer_fetch_non_coherent */
> { "glFramebufferFetchBarrierEXT", 20, -1 },
>
> + /* GL_ARB_sample_locations */
> + { "glFramebufferSampleLocationsfvARB", 30, -1 },
> + { "glNamedFramebufferSampleLocationsfvARB", 30, -1 },
> + { "glEvaluateDepthValuesARB", 30, -1 },
> +
> { NULL, 0, -1 }
> };
>
> @@ -2752,5 +2757,10 @@ const struct function gles31_functions_possible[] =
> {
> { "glDepthRangeIndexedfOES", 31, -1 },
> { "glGetFloati_vOES", 31, -1 },
>
> + /* GL_ARB_sample_locations */
> + { "glFramebufferSampleLocationsfvARB", 31, -1 },
> + { "glNamedFramebufferSampleLocationsfvARB", 31, -1 },
> + { "glEvaluateDepthValuesARB", 31, -1 },
> +
> { NULL, 0, -1 },
> };
> --
> 2.14.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180508/90e83f00/attachment-0001.html>
More information about the mesa-dev
mailing list