Commit 152a09ce authored by Matteo Bruni's avatar Matteo Bruni Committed by Alexandre Julliard

wined3d: Use GL_FRAMEBUFFER_SRGB when possible.

parent 2c97f3fc
...@@ -6495,6 +6495,20 @@ static void textransform(struct wined3d_context *context, const struct wined3d_s ...@@ -6495,6 +6495,20 @@ static void textransform(struct wined3d_context *context, const struct wined3d_s
fragment_prog_arbfp(context, state, state_id); fragment_prog_arbfp(context, state, state_id);
} }
static void state_srgbwrite(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
const struct wined3d_surface *rt = state->fb->render_targets[0];
TRACE("context %p, state %p, state_id %#x.\n", context, state, state_id);
if (state->render_states[WINED3D_RS_SRGBWRITEENABLE]
&& rt->resource.format->flags & WINED3DFMT_FLAG_SRGB_WRITE)
gl_info->gl_ops.gl.p_glEnable(GL_FRAMEBUFFER_SRGB);
else
gl_info->gl_ops.gl.p_glDisable(GL_FRAMEBUFFER_SRGB);
}
static const struct StateEntryTemplate arbfp_fragmentstate_template[] = static const struct StateEntryTemplate arbfp_fragmentstate_template[] =
{ {
{STATE_RENDER(WINED3D_RS_TEXTUREFACTOR), { STATE_RENDER(WINED3D_RS_TEXTUREFACTOR), state_texfactor_arbfp }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_TEXTUREFACTOR), { STATE_RENDER(WINED3D_RS_TEXTUREFACTOR), state_texfactor_arbfp }, WINED3D_GL_EXT_NONE },
...@@ -6624,6 +6638,7 @@ static const struct StateEntryTemplate arbfp_fragmentstate_template[] = ...@@ -6624,6 +6638,7 @@ static const struct StateEntryTemplate arbfp_fragmentstate_template[] =
{STATE_RENDER(WINED3D_RS_FOGVERTEXMODE), { STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_FOGVERTEXMODE), { STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3D_RS_FOGSTART), { STATE_RENDER(WINED3D_RS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_FOGSTART), { STATE_RENDER(WINED3D_RS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3D_RS_FOGEND), { STATE_RENDER(WINED3D_RS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_FOGEND), { STATE_RENDER(WINED3D_RS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), { STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), state_srgbwrite }, ARB_FRAMEBUFFER_SRGB },
{STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3D_RS_FOGCOLOR), { STATE_RENDER(WINED3D_RS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_FOGCOLOR), { STATE_RENDER(WINED3D_RS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3D_RS_FOGDENSITY), { STATE_RENDER(WINED3D_RS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_FOGDENSITY), { STATE_RENDER(WINED3D_RS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE },
......
...@@ -100,6 +100,7 @@ static const struct wined3d_extension_map gl_extension_map[] = ...@@ -100,6 +100,7 @@ static const struct wined3d_extension_map gl_extension_map[] =
{"GL_ARB_fragment_program", ARB_FRAGMENT_PROGRAM }, {"GL_ARB_fragment_program", ARB_FRAGMENT_PROGRAM },
{"GL_ARB_fragment_shader", ARB_FRAGMENT_SHADER }, {"GL_ARB_fragment_shader", ARB_FRAGMENT_SHADER },
{"GL_ARB_framebuffer_object", ARB_FRAMEBUFFER_OBJECT }, {"GL_ARB_framebuffer_object", ARB_FRAMEBUFFER_OBJECT },
{"GL_ARB_framebuffer_sRGB", ARB_FRAMEBUFFER_SRGB },
{"GL_ARB_geometry_shader4", ARB_GEOMETRY_SHADER4 }, {"GL_ARB_geometry_shader4", ARB_GEOMETRY_SHADER4 },
{"GL_ARB_half_float_pixel", ARB_HALF_FLOAT_PIXEL }, {"GL_ARB_half_float_pixel", ARB_HALF_FLOAT_PIXEL },
{"GL_ARB_half_float_vertex", ARB_HALF_FLOAT_VERTEX }, {"GL_ARB_half_float_vertex", ARB_HALF_FLOAT_VERTEX },
...@@ -2731,6 +2732,13 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter) ...@@ -2731,6 +2732,13 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter)
/* GL_ARB_half_float_vertex is a subset of GL_NV_half_float. */ /* GL_ARB_half_float_vertex is a subset of GL_NV_half_float. */
gl_info->supported[ARB_HALF_FLOAT_VERTEX] = TRUE; gl_info->supported[ARB_HALF_FLOAT_VERTEX] = TRUE;
} }
if (gl_info->supported[ARB_FRAMEBUFFER_SRGB] && !gl_info->supported[EXT_TEXTURE_SRGB_DECODE])
{
/* Current wined3d sRGB infrastructure requires EXT_texture_sRGB_decode
* for GL_ARB_framebuffer_sRGB support (without EXT_texture_sRGB_decode
* we never render to sRGB surfaces). */
gl_info->supported[ARB_FRAMEBUFFER_SRGB] = FALSE;
}
ENTER_GL(); ENTER_GL();
...@@ -4608,6 +4616,8 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte ...@@ -4608,6 +4616,8 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte
caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_SEPARATEALPHABLEND; caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_SEPARATEALPHABLEND;
if (gl_info->supported[EXT_DRAW_BUFFERS2]) if (gl_info->supported[EXT_DRAW_BUFFERS2])
caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS; caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS;
if (gl_info->supported[ARB_FRAMEBUFFER_SRGB])
caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_POSTBLENDSRGBCONVERT;
caps->RasterCaps = WINED3DPRASTERCAPS_DITHER | caps->RasterCaps = WINED3DPRASTERCAPS_DITHER |
WINED3DPRASTERCAPS_PAT | WINED3DPRASTERCAPS_PAT |
......
...@@ -1901,14 +1901,23 @@ void find_ps_compile_args(const struct wined3d_state *state, ...@@ -1901,14 +1901,23 @@ void find_ps_compile_args(const struct wined3d_state *state,
const struct wined3d_shader *shader, struct ps_compile_args *args) const struct wined3d_shader *shader, struct ps_compile_args *args)
{ {
struct wined3d_device *device = shader->device; struct wined3d_device *device = shader->device;
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
const struct wined3d_texture *texture; const struct wined3d_texture *texture;
UINT i; UINT i;
memset(args, 0, sizeof(*args)); /* FIXME: Make sure all bits are set. */ memset(args, 0, sizeof(*args)); /* FIXME: Make sure all bits are set. */
if (state->render_states[WINED3D_RS_SRGBWRITEENABLE]) if (!gl_info->supported[ARB_FRAMEBUFFER_SRGB] && state->render_states[WINED3D_RS_SRGBWRITEENABLE])
{ {
const struct wined3d_surface *rt = state->fb->render_targets[0]; const struct wined3d_surface *rt = state->fb->render_targets[0];
if (rt->resource.format->flags & WINED3DFMT_FLAG_SRGB_WRITE) args->srgb_correction = 1; if (rt->resource.format->flags & WINED3DFMT_FLAG_SRGB_WRITE)
{
static unsigned int warned = 0;
args->srgb_correction = 1;
if (state->render_states[WINED3D_RS_ALPHABLENDENABLE] && !warned++)
WARN("Blending into a sRGB render target with no GL_ARB_framebuffer_sRGB "
"support, expect rendering artifacts.\n");
}
} }
if (shader->reg_maps.shader_version.major == 1 if (shader->reg_maps.shader_version.major == 1
......
...@@ -3138,7 +3138,8 @@ void gen_ffp_frag_op(const struct wined3d_device *device, const struct wined3d_s ...@@ -3138,7 +3138,8 @@ void gen_ffp_frag_op(const struct wined3d_device *device, const struct wined3d_s
break; break;
} }
} }
if (state->render_states[WINED3D_RS_SRGBWRITEENABLE] if (!gl_info->supported[ARB_FRAMEBUFFER_SRGB]
&& state->render_states[WINED3D_RS_SRGBWRITEENABLE]
&& rt->resource.format->flags & WINED3DFMT_FLAG_SRGB_WRITE) && rt->resource.format->flags & WINED3DFMT_FLAG_SRGB_WRITE)
{ {
settings->sRGB_write = 1; settings->sRGB_write = 1;
......
...@@ -933,6 +933,7 @@ enum wined3d_gl_extension ...@@ -933,6 +933,7 @@ enum wined3d_gl_extension
ARB_FRAGMENT_PROGRAM, ARB_FRAGMENT_PROGRAM,
ARB_FRAGMENT_SHADER, ARB_FRAGMENT_SHADER,
ARB_FRAMEBUFFER_OBJECT, ARB_FRAMEBUFFER_OBJECT,
ARB_FRAMEBUFFER_SRGB,
ARB_GEOMETRY_SHADER4, ARB_GEOMETRY_SHADER4,
ARB_HALF_FLOAT_PIXEL, ARB_HALF_FLOAT_PIXEL,
ARB_HALF_FLOAT_VERTEX, ARB_HALF_FLOAT_VERTEX,
...@@ -1255,6 +1256,12 @@ enum wined3d_gl_extension ...@@ -1255,6 +1256,12 @@ enum wined3d_gl_extension
#define GL_TEXTURE_STENCIL_SIZE 0x88f1 #define GL_TEXTURE_STENCIL_SIZE 0x88f1
#endif #endif
/* GL_ARB_framebuffer_sRGB */
#ifndef GL_ARB_framebuffer_sRGB
#define GL_ARB_framebuffer_sRGB 1
#define GL_FRAMEBUFFER_SRGB 0x8db9
#endif
/* GL_ARB_geometry_shader4 */ /* GL_ARB_geometry_shader4 */
#ifndef GL_ARB_geometry_shader4 #ifndef GL_ARB_geometry_shader4
#define GL_ARB_geometry_shader4 1 #define GL_ARB_geometry_shader4 1
......
...@@ -1015,6 +1015,7 @@ enum wined3d_display_rotation ...@@ -1015,6 +1015,7 @@ enum wined3d_display_rotation
#define WINED3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS 0x00040000 #define WINED3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS 0x00040000
#define WINED3DPMISCCAPS_MRTPOSTPIXELSHADERBLENDING 0x00080000 #define WINED3DPMISCCAPS_MRTPOSTPIXELSHADERBLENDING 0x00080000
#define WINED3DPMISCCAPS_FOGVERTEXCLAMPED 0x00100000 #define WINED3DPMISCCAPS_FOGVERTEXCLAMPED 0x00100000
#define WINED3DPMISCCAPS_POSTBLENDSRGBCONVERT 0x00200000
#define WINED3DPS20_MAX_DYNAMICFLOWCONTROLDEPTH 24 #define WINED3DPS20_MAX_DYNAMICFLOWCONTROLDEPTH 24
#define WINED3DPS20_MIN_DYNAMICFLOWCONTROLDEPTH 0 #define WINED3DPS20_MIN_DYNAMICFLOWCONTROLDEPTH 0
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment