mesa: implement GetMultisamplefv

Actual sample locations deferred to a driverfunc since only the driver
really knows where they will be.

V2: - pass the draw buffer to the driverfunc; don't fallback to pixel
      center if driverfunc is missing.
    - rename GetSampleLocation to GetSamplePosition
    - invert y sample position for winsys FBOs, at Paul's suggestion

Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Chris Forbes 2012-11-25 20:23:32 +13:00
parent abb5429537
commit 7c1017e292
3 changed files with 34 additions and 2 deletions

View file

@ -209,6 +209,9 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
/* GL_ARB_texture_storage */
driver->AllocTextureStorage = _swrast_AllocTextureStorage;
/* GL_ARB_texture_multisample */
driver->GetSamplePosition = NULL;
}

View file

@ -833,6 +833,14 @@ struct dd_function_table {
* This should be equivalent to glGetInteger64v(GL_TIMESTAMP);
*/
uint64_t (*GetTimestamp)(struct gl_context *ctx);
/**
* \name GL_ARB_texture_multisample
*/
void (*GetSamplePosition)(struct gl_context *ctx,
struct gl_framebuffer *fb,
GLuint index,
GLfloat *outValue);
};

View file

@ -28,6 +28,7 @@
#include "main/macros.h"
#include "main/multisample.h"
#include "main/mtypes.h"
#include "main/fbobject.h"
/**
@ -65,8 +66,28 @@ _mesa_init_multisample(struct gl_context *ctx)
void GLAPIENTRY
_mesa_GetMultisamplefv(GLenum pname, GLuint index, GLfloat * val)
{
assert(!"Not implemented");
// TODO: make this work
GET_CURRENT_CONTEXT(ctx);
switch (pname) {
case GL_SAMPLE_POSITION: {
if (index >= ctx->DrawBuffer->Visual.samples) {
_mesa_error( ctx, GL_INVALID_VALUE, "glGetMultisamplefv(index)" );
return;
}
ctx->Driver.GetSamplePosition(ctx, ctx->DrawBuffer, index, val);
/* winsys FBOs are upside down */
if (_mesa_is_winsys_fbo(ctx->DrawBuffer))
val[1] = 1 - val[1];
return;
}
default:
_mesa_error( ctx, GL_INVALID_ENUM, "glGetMultisamplefv(pname)" );
return;
}
}
void GLAPIENTRY