[Mesa-dev] [PATCH] mesa/st: use a new cap to determine the viewport bounds range
Ilia Mirkin
imirkin at alum.mit.edu
Mon Feb 10 21:04:20 PST 2014
The bound range is disconnected from the viewport dimensions. This is
the relevant bit from glViewportArray:
"""
The location of the viewport's bottom left corner, given by (x, y) is
clamped to be within the implementaiton-dependent viewport bounds range.
The viewport bounds range [min, max] can be determined by calling glGet
with argument GL_VIEWPORT_BOUNDS_RANGE. Viewport width and height are
silently clamped to a range that depends on the implementation. To query
this range, call glGet with argument GL_MAX_VIEWPORT_DIMS.
"""
This will allow nouveau to report compliant values for
ARB_viewport_array.
Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
---
Another alternative is to just hardcode +/- 16384.0 and let the first person
who runs into different limits deal with it.
src/gallium/docs/source/screen.rst | 2 ++
src/gallium/drivers/llvmpipe/lp_screen.c | 2 ++
src/gallium/drivers/radeon/r600_pipe_common.c | 2 ++
src/gallium/include/pipe/p_defines.h | 3 ++-
src/mesa/state_tracker/st_extensions.c | 5 +++--
5 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/gallium/docs/source/screen.rst b/src/gallium/docs/source/screen.rst
index bd553f4..c76d422 100644
--- a/src/gallium/docs/source/screen.rst
+++ b/src/gallium/docs/source/screen.rst
@@ -203,6 +203,8 @@ The floating-point capabilities are:
``PIPE_CAPF_GUARD_BAND_TOP``,
``PIPE_CAPF_GUARD_BAND_RIGHT``,
``PIPE_CAPF_GUARD_BAND_BOTTOM``: TODO
+* ``PIPE_CAPF_VIEWPORT_BOUNDS_RANGE``: The maximum positive viewport bounds.
+ The minimum will be set to the negative of this value.
.. _pipe_shader_cap:
diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c
index 43142e7..e8c96ac 100644
--- a/src/gallium/drivers/llvmpipe/lp_screen.c
+++ b/src/gallium/drivers/llvmpipe/lp_screen.c
@@ -298,6 +298,8 @@ llvmpipe_get_paramf(struct pipe_screen *screen, enum pipe_capf param)
case PIPE_CAPF_GUARD_BAND_RIGHT:
case PIPE_CAPF_GUARD_BAND_BOTTOM:
return 0.0;
+ case PIPE_CAPF_VIEWPORT_BOUNDS_RANGE:
+ return 16384.0f;
}
/* should only get here on unhandled cases */
debug_printf("Unexpected PIPE_CAP %d query\n", param);
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c
index 7af8124..807ce9a 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.c
+++ b/src/gallium/drivers/radeon/r600_pipe_common.c
@@ -215,6 +215,8 @@ static float r600_get_paramf(struct pipe_screen* pscreen,
case PIPE_CAPF_GUARD_BAND_RIGHT:
case PIPE_CAPF_GUARD_BAND_BOTTOM:
return 0.0f;
+ case PIPE_CAPF_VIEWPORT_BOUNDS_RANGE:
+ return 16384.0f;
}
return 0.0f;
}
diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h
index 83815cd..13687d7 100644
--- a/src/gallium/include/pipe/p_defines.h
+++ b/src/gallium/include/pipe/p_defines.h
@@ -553,7 +553,8 @@ enum pipe_capf
PIPE_CAPF_GUARD_BAND_LEFT = 21,
PIPE_CAPF_GUARD_BAND_TOP = 22,
PIPE_CAPF_GUARD_BAND_RIGHT = 23,
- PIPE_CAPF_GUARD_BAND_BOTTOM = 24
+ PIPE_CAPF_GUARD_BAND_BOTTOM = 24,
+ PIPE_CAPF_VIEWPORT_BOUNDS_RANGE = 25,
};
/* Shader caps not specific to any single stage */
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index 1f391c9..e0788e8 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -783,8 +783,9 @@ void st_init_extensions(struct st_context *st)
if (ctx->API == API_OPENGL_CORE) {
ctx->Const.MaxViewports = screen->get_param(screen, PIPE_CAP_MAX_VIEWPORTS);
if (ctx->Const.MaxViewports >= 16) {
- ctx->Const.ViewportBounds.Min = -(float)ctx->Const.MaxViewportWidth;
- ctx->Const.ViewportBounds.Max = ctx->Const.MaxViewportWidth;
+ float bound = screen->get_paramf(screen, PIPE_CAPF_VIEWPORT_BOUNDS_RANGE);
+ ctx->Const.ViewportBounds.Min = -bound;
+ ctx->Const.ViewportBounds.Max = bound;
ctx->Extensions.ARB_viewport_array = GL_TRUE;
}
}
--
1.8.3.2
More information about the mesa-dev
mailing list