st/mesa: do vertex and fragment color clamping in shaders
For ARB_color_buffer_float. Most hardware can't do it and st/mesa is the perfect place for a fallback. The exceptions are: - r500 (vertex clamp only) - nv50 (both) - nvc0 (both) - softpipe (both) We also have to take into account that r300 can do CLAMPED vertex colors only, while r600 can do UNCLAMPED vertex colors only. The difference can be expressed with the two new CAPs.
This commit is contained in:
@@ -607,33 +607,16 @@ void st_init_extensions(struct st_context *st)
|
||||
ctx->Extensions.ARB_depth_clamp = GL_TRUE;
|
||||
}
|
||||
|
||||
/* This extension does not actually require support of floating point
|
||||
* render targets, just clamping controls.
|
||||
* Advertise this extension if either fragment color clamping is supported
|
||||
* or no render targets having color values outside of the range [0, 1]
|
||||
* are supported, in which case the fragment color clamping has no effect
|
||||
* on rendering.
|
||||
*/
|
||||
if (screen->get_param(screen, PIPE_CAP_FRAGMENT_COLOR_CLAMP_CONTROL) ||
|
||||
(!screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_SNORM,
|
||||
PIPE_TEXTURE_2D, 0,
|
||||
PIPE_BIND_RENDER_TARGET) &&
|
||||
!screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_SNORM,
|
||||
PIPE_TEXTURE_2D, 0,
|
||||
PIPE_BIND_RENDER_TARGET) &&
|
||||
!screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_FLOAT,
|
||||
PIPE_TEXTURE_2D, 0,
|
||||
PIPE_BIND_RENDER_TARGET) &&
|
||||
!screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_FLOAT,
|
||||
PIPE_TEXTURE_2D, 0,
|
||||
PIPE_BIND_RENDER_TARGET) &&
|
||||
!screen->is_format_supported(screen, PIPE_FORMAT_R11G11B10_FLOAT,
|
||||
PIPE_TEXTURE_2D, 0,
|
||||
PIPE_BIND_RENDER_TARGET) &&
|
||||
!screen->is_format_supported(screen, PIPE_FORMAT_R9G9B9E5_FLOAT,
|
||||
PIPE_TEXTURE_2D, 0,
|
||||
PIPE_BIND_RENDER_TARGET))) {
|
||||
if (screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_UNCLAMPED)) {
|
||||
ctx->Extensions.ARB_color_buffer_float = GL_TRUE;
|
||||
|
||||
if (!screen->get_param(screen, PIPE_CAP_VERTEX_COLOR_CLAMPED)) {
|
||||
st->clamp_vert_color_in_shader = TRUE;
|
||||
}
|
||||
|
||||
if (!screen->get_param(screen, PIPE_CAP_FRAGMENT_COLOR_CLAMPED)) {
|
||||
st->clamp_frag_color_in_shader = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (screen->get_param(screen, PIPE_CAP_SHADER_STENCIL_EXPORT)) {
|
||||
|
Reference in New Issue
Block a user