From: Marek Olšák <marek.ol...@amd.com> Some places need more changes because pipe_surface::format is never sRGB now. --- src/mesa/state_tracker/st_atom.c | 2 +- src/mesa/state_tracker/st_atom.h | 7 ++++--- src/mesa/state_tracker/st_atom_blend.c | 3 +++ src/mesa/state_tracker/st_atom_framebuffer.c | 11 +++++++++-- src/mesa/state_tracker/st_atom_list.h | 2 +- src/mesa/state_tracker/st_cb_blit.c | 12 ++++++++++++ src/mesa/state_tracker/st_cb_clear.c | 3 +++ src/mesa/state_tracker/st_cb_fbo.c | 4 +++- src/mesa/state_tracker/st_context.c | 8 +++++++- src/mesa/state_tracker/st_context.h | 2 ++ 10 files changed, 45 insertions(+), 9 deletions(-)
diff --git a/src/mesa/state_tracker/st_atom.c b/src/mesa/state_tracker/st_atom.c index bcfbcf8..52c781f 100644 --- a/src/mesa/state_tracker/st_atom.c +++ b/src/mesa/state_tracker/st_atom.c @@ -175,21 +175,21 @@ void st_validate_state( struct st_context *st, enum st_pipeline pipeline ) st->gfx_shaders_may_be_dirty = false; } st_manager_validate_framebuffers(st); pipeline_mask = ST_PIPELINE_RENDER_STATE_MASK; break; case ST_PIPELINE_CLEAR: st_manager_validate_framebuffers(st); - pipeline_mask = ST_PIPELINE_CLEAR_STATE_MASK; + pipeline_mask = ST_PIPELINE_CLEAR_STATE_MASK(st); break; case ST_PIPELINE_UPDATE_FRAMEBUFFER: st_manager_validate_framebuffers(st); pipeline_mask = ST_PIPELINE_UPDATE_FB_STATE_MASK; break; case ST_PIPELINE_COMPUTE: { struct st_compute_program *old_cp = st->cp; struct gl_program *new_cp = ctx->ComputeProgram._Current; diff --git a/src/mesa/state_tracker/st_atom.h b/src/mesa/state_tracker/st_atom.h index 663bc06..1843d48 100644 --- a/src/mesa/state_tracker/st_atom.h +++ b/src/mesa/state_tracker/st_atom.h @@ -139,20 +139,21 @@ enum { ST_NEW_SAMPLERS | \ ST_NEW_CONSTANTS | \ ST_NEW_UNIFORM_BUFFER | \ ST_NEW_ATOMIC_BUFFER | \ ST_NEW_STORAGE_BUFFER | \ ST_NEW_IMAGE_UNITS) /* All state flags within each group: */ #define ST_PIPELINE_RENDER_STATE_MASK (ST_NEW_CS_STATE - 1) #define ST_PIPELINE_COMPUTE_STATE_MASK (0xffllu << ST_NEW_CS_STATE_INDEX) -#define ST_PIPELINE_CLEAR_STATE_MASK (ST_NEW_FB_STATE | \ - ST_NEW_SCISSOR | \ - ST_NEW_WINDOW_RECTANGLES) +#define ST_PIPELINE_CLEAR_STATE_MASK(st) (ST_NEW_FB_STATE | \ + (st->has_srgb_enable ? ST_NEW_BLEND : 0) | \ + ST_NEW_SCISSOR | \ + ST_NEW_WINDOW_RECTANGLES) /* For ReadPixels, ReadBuffer, GetSamplePosition: */ #define ST_PIPELINE_UPDATE_FB_STATE_MASK (ST_NEW_FB_STATE) #define ST_ALL_STATES_MASK (ST_PIPELINE_RENDER_STATE_MASK | \ ST_PIPELINE_COMPUTE_STATE_MASK) #endif diff --git a/src/mesa/state_tracker/st_atom_blend.c b/src/mesa/state_tracker/st_atom_blend.c index 7428997..85edf05 100644 --- a/src/mesa/state_tracker/st_atom_blend.c +++ b/src/mesa/state_tracker/st_atom_blend.c @@ -268,18 +268,21 @@ st_update_blend( struct st_context *st ) if (ctx->Multisample.Enabled && ctx->DrawBuffer->Visual.sampleBuffers > 0 && !(ctx->DrawBuffer->_IntegerBuffers & 0x1)) { /* Unlike in gallium/d3d10 these operations are only performed * if both msaa is enabled and we have a multisample buffer. */ blend->alpha_to_coverage = ctx->Multisample.SampleAlphaToCoverage; blend->alpha_to_one = ctx->Multisample.SampleAlphaToOne; } + if (st->has_srgb_enable && ctx->Color.sRGBEnabled) + blend->srgb_enable = st->state.fb_srgb_buffers; + cso_set_blend(st->cso_context, blend); { struct pipe_blend_color bc; COPY_4FV(bc.color, ctx->Color.BlendColorUnclamped); cso_set_blend_color(st->cso_context, &bc); } } diff --git a/src/mesa/state_tracker/st_atom_framebuffer.c b/src/mesa/state_tracker/st_atom_framebuffer.c index acbe980..e08cac1 100644 --- a/src/mesa/state_tracker/st_atom_framebuffer.c +++ b/src/mesa/state_tracker/st_atom_framebuffer.c @@ -110,20 +110,21 @@ st_update_framebuffer_state( struct st_context *st ) { struct pipe_framebuffer_state framebuffer; struct gl_framebuffer *fb = st->ctx->DrawBuffer; struct st_renderbuffer *strb; GLuint i; st_flush_bitmap_cache(st); st_invalidate_readpix_cache(st); st->state.fb_orientation = st_fb_orientation(fb); + st->state.fb_srgb_buffers = 0; /** * Quantize the derived default number of samples: * * A query to the driver of supported MSAA values the * hardware supports is done as to legalize the number * of application requested samples, NumSamples. * See commit eb9cf3c for more information. */ fb->DefaultGeometry._NumSamples = @@ -137,27 +138,33 @@ st_update_framebuffer_state( struct st_context *st ) /* Examine Mesa's ctx->DrawBuffer->_ColorDrawBuffers state * to determine which surfaces to draw to */ framebuffer.nr_cbufs = fb->_NumColorDrawBuffers; for (i = 0; i < fb->_NumColorDrawBuffers; i++) { framebuffer.cbufs[i] = NULL; strb = st_renderbuffer(fb->_ColorDrawBuffers[i]); if (strb) { - if (strb->is_rtt || (strb->texture && - _mesa_get_format_color_encoding(strb->Base.Format) == GL_SRGB)) { + bool is_srgb = + _mesa_get_format_color_encoding(strb->Base.Format) == GL_SRGB; + + if (strb->is_rtt || + (strb->texture && !st->has_srgb_enable && is_srgb)) { /* rendering to a GL texture, may have to update surface */ st_update_renderbuffer_surface(st, strb); } if (strb->surface) { + if (is_srgb) + st->state.fb_srgb_buffers |= 1 << i; + framebuffer.cbufs[i] = strb->surface; update_framebuffer_size(&framebuffer, strb->surface); } strb->defined = GL_TRUE; /* we'll be drawing something */ } } for (i = framebuffer.nr_cbufs; i < PIPE_MAX_COLOR_BUFS; i++) { framebuffer.cbufs[i] = NULL; } diff --git a/src/mesa/state_tracker/st_atom_list.h b/src/mesa/state_tracker/st_atom_list.h index 614ee90..ed20a32 100644 --- a/src/mesa/state_tracker/st_atom_list.h +++ b/src/mesa/state_tracker/st_atom_list.h @@ -6,21 +6,20 @@ ST_STATE(ST_NEW_FS_STATE, st_update_fp) ST_STATE(ST_NEW_GS_STATE, st_update_gp) ST_STATE(ST_NEW_TES_STATE, st_update_tep) ST_STATE(ST_NEW_TCS_STATE, st_update_tcp) ST_STATE(ST_NEW_VS_STATE, st_update_vp) ST_STATE(ST_NEW_RASTERIZER, st_update_rasterizer) ST_STATE(ST_NEW_POLY_STIPPLE, st_update_polygon_stipple) ST_STATE(ST_NEW_VIEWPORT, st_update_viewport) ST_STATE(ST_NEW_SCISSOR, st_update_scissor) ST_STATE(ST_NEW_WINDOW_RECTANGLES, st_update_window_rectangles) -ST_STATE(ST_NEW_BLEND, st_update_blend) ST_STATE(ST_NEW_VS_SAMPLER_VIEWS, st_update_vertex_textures) ST_STATE(ST_NEW_FS_SAMPLER_VIEWS, st_update_fragment_textures) ST_STATE(ST_NEW_GS_SAMPLER_VIEWS, st_update_geometry_textures) ST_STATE(ST_NEW_TCS_SAMPLER_VIEWS, st_update_tessctrl_textures) ST_STATE(ST_NEW_TES_SAMPLER_VIEWS, st_update_tesseval_textures) /* Non-compute samplers. */ ST_STATE(ST_NEW_VS_SAMPLERS, st_update_vertex_samplers) /* depends on update_*_texture for swizzle */ ST_STATE(ST_NEW_TCS_SAMPLERS, st_update_tessctrl_samplers) /* depends on update_*_texture for swizzle */ @@ -30,20 +29,21 @@ ST_STATE(ST_NEW_FS_SAMPLERS, st_update_fragment_samplers) /* depends on update_* ST_STATE(ST_NEW_VS_IMAGES, st_bind_vs_images) ST_STATE(ST_NEW_TCS_IMAGES, st_bind_tcs_images) ST_STATE(ST_NEW_TES_IMAGES, st_bind_tes_images) ST_STATE(ST_NEW_GS_IMAGES, st_bind_gs_images) ST_STATE(ST_NEW_FS_IMAGES, st_bind_fs_images) ST_STATE(ST_NEW_FB_STATE, st_update_framebuffer_state) /* depends on update_*_texture and bind_*_images */ ST_STATE(ST_NEW_SAMPLE_MASK, st_update_sample_mask) /* depends on update_framebuffer_state */ ST_STATE(ST_NEW_SAMPLE_SHADING, st_update_sample_shading) +ST_STATE(ST_NEW_BLEND, st_update_blend) /* depends on update_framebuffer_state */ ST_STATE(ST_NEW_VS_CONSTANTS, st_update_vs_constants) ST_STATE(ST_NEW_TCS_CONSTANTS, st_update_tcs_constants) ST_STATE(ST_NEW_TES_CONSTANTS, st_update_tes_constants) ST_STATE(ST_NEW_GS_CONSTANTS, st_update_gs_constants) ST_STATE(ST_NEW_FS_CONSTANTS, st_update_fs_constants) ST_STATE(ST_NEW_VS_UBOS, st_bind_vs_ubos) ST_STATE(ST_NEW_TCS_UBOS, st_bind_tcs_ubos) ST_STATE(ST_NEW_TES_UBOS, st_bind_tes_ubos) diff --git a/src/mesa/state_tracker/st_cb_blit.c b/src/mesa/state_tracker/st_cb_blit.c index 8aa849b..92e404f 100644 --- a/src/mesa/state_tracker/st_cb_blit.c +++ b/src/mesa/state_tracker/st_cb_blit.c @@ -200,20 +200,24 @@ st_BlitFramebuffer(struct gl_context *ctx, blit.dst.resource = dstSurf->texture; blit.dst.level = dstSurf->u.tex.level; blit.dst.box.z = dstSurf->u.tex.first_layer; blit.dst.format = dstSurf->format; blit.src.resource = srcObj->pt; blit.src.level = srcAtt->TextureLevel; blit.src.box.z = srcAtt->Zoffset + srcAtt->CubeMapFace; blit.src.format = srcObj->pt->format; + if (ctx->Color.sRGBEnabled && + _mesa_get_format_color_encoding(dstRb->Base.Format) == GL_SRGB) + blit.dst.format = util_format_srgb(blit.dst.format); + if (!ctx->Color.sRGBEnabled) blit.src.format = util_format_linear(blit.src.format); st->pipe->blit(st->pipe, &blit); dstRb->defined = true; /* front buffer tracking */ } } } } else { @@ -247,20 +251,28 @@ st_BlitFramebuffer(struct gl_context *ctx, blit.dst.resource = dstSurf->texture; blit.dst.level = dstSurf->u.tex.level; blit.dst.box.z = dstSurf->u.tex.first_layer; blit.dst.format = dstSurf->format; blit.src.resource = srcSurf->texture; blit.src.level = srcSurf->u.tex.level; blit.src.box.z = srcSurf->u.tex.first_layer; blit.src.format = srcSurf->format; + if (ctx->Color.sRGBEnabled) { + if (_mesa_get_format_color_encoding(dstRb->Base.Format) == GL_SRGB) + blit.dst.format = util_format_srgb(blit.dst.format); + + if (_mesa_get_format_color_encoding(srcRb->Base.Format) == GL_SRGB) + blit.src.format = util_format_srgb(blit.src.format); + } + st->pipe->blit(st->pipe, &blit); dstRb->defined = true; /* front buffer tracking */ } } } } } if (mask & depthStencil) { /* depth and/or stencil blit */ diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c index cda9c71..89c7452 100644 --- a/src/mesa/state_tracker/st_cb_clear.c +++ b/src/mesa/state_tracker/st_cb_clear.c @@ -231,20 +231,23 @@ clear_with_quad(struct gl_context *ctx, unsigned clear_buffers) if (ctx->Color.ColorMask[i][1]) blend.rt[i].colormask |= PIPE_MASK_G; if (ctx->Color.ColorMask[i][2]) blend.rt[i].colormask |= PIPE_MASK_B; if (ctx->Color.ColorMask[i][3]) blend.rt[i].colormask |= PIPE_MASK_A; } if (ctx->Color.DitherFlag) blend.dither = 1; + + if (st->has_srgb_enable && ctx->Color.sRGBEnabled) + blend.srgb_enable = st->state.fb_srgb_buffers; } cso_set_blend(cso, &blend); } /* depth_stencil state: always pass/set to ref value */ { struct pipe_depth_stencil_alpha_state depth_stencil; memset(&depth_stencil, 0, sizeof(depth_stencil)); if (clear_buffers & PIPE_CLEAR_DEPTH) { depth_stencil.depth.enabled = 1; diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c index 2559c23..1d30a25 100644 --- a/src/mesa/state_tracker/st_cb_fbo.c +++ b/src/mesa/state_tracker/st_cb_fbo.c @@ -384,21 +384,23 @@ st_update_renderbuffer_surface(struct st_context *st, unsigned rtt_width = strb->Base.Width; unsigned rtt_height = strb->Base.Height; unsigned rtt_depth = strb->Base.Depth; /* * For winsys fbo, it is possible that the renderbuffer is sRGB-capable but * the format of strb->texture is linear (because we have no control over * the format). Check strb->Base.Format instead of strb->texture->format * to determine if the rb is sRGB-capable. */ - boolean enable_srgb = st->ctx->Color.sRGBEnabled && + boolean enable_srgb = + !st->has_srgb_enable && + st->ctx->Color.sRGBEnabled && _mesa_get_format_color_encoding(strb->Base.Format) == GL_SRGB; enum pipe_format format = resource->format; if (strb->is_rtt) { stTexObj = st_texture_object(strb->Base.TexImage->TexObject); if (stTexObj->surface_based) format = stTexObj->surface_format; } format = enable_srgb ? util_format_srgb(format) : util_format_linear(format); diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index a81b2c2..cbc39b1 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -301,20 +301,22 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe, /* state tracker needs the VBO module */ _vbo_CreateContext(ctx); st->dirty = ST_ALL_STATES_MASK; st->has_user_constbuf = screen->get_param(screen, PIPE_CAP_USER_CONSTANT_BUFFERS); st->can_bind_const_buffer_as_vertex = screen->get_param(screen, PIPE_CAP_CAN_BIND_CONST_BUFFER_AS_VERTEX); + st->has_srgb_enable = + screen->get_param(screen, PIPE_CAP_BLEND_STATE_SRGB_ENABLE); /* Drivers still have to upload zero-stride vertex attribs manually * with the GL core profile, but they don't have to deal with any complex * user vertex buffer uploads. */ unsigned vbuf_flags = ctx->API == API_OPENGL_CORE ? U_VBUF_FLAG_NO_USER_VBOS : 0; st->cso_context = cso_create_context(pipe, vbuf_flags); st_init_atoms( st ); @@ -488,22 +490,26 @@ static void st_init_driver_flags(struct st_context *st) f->NewShaderStorageBuffer = ST_NEW_STORAGE_BUFFER; f->NewImageUnits = ST_NEW_IMAGE_UNITS; f->NewShaderConstants[MESA_SHADER_VERTEX] = ST_NEW_VS_CONSTANTS; f->NewShaderConstants[MESA_SHADER_TESS_CTRL] = ST_NEW_TCS_CONSTANTS; f->NewShaderConstants[MESA_SHADER_TESS_EVAL] = ST_NEW_TES_CONSTANTS; f->NewShaderConstants[MESA_SHADER_GEOMETRY] = ST_NEW_GS_CONSTANTS; f->NewShaderConstants[MESA_SHADER_FRAGMENT] = ST_NEW_FS_CONSTANTS; f->NewShaderConstants[MESA_SHADER_COMPUTE] = ST_NEW_CS_CONSTANTS; + if (st->has_srgb_enable) + f->NewFramebufferSRGB = ST_NEW_BLEND; + else + f->NewFramebufferSRGB = ST_NEW_FRAMEBUFFER; + f->NewWindowRectangles = ST_NEW_WINDOW_RECTANGLES; - f->NewFramebufferSRGB = ST_NEW_FRAMEBUFFER; f->NewScissorRect = ST_NEW_SCISSOR; f->NewScissorTest = ST_NEW_SCISSOR | ST_NEW_RASTERIZER; f->NewAlphaTest = ST_NEW_DSA; f->NewBlend = ST_NEW_BLEND; f->NewBlendColor = ST_NEW_BLEND; /* TODO: add an atom for blend color */ f->NewColorMask = ST_NEW_BLEND; f->NewDepth = ST_NEW_DSA; f->NewLogicOp = ST_NEW_BLEND; f->NewStencil = ST_NEW_DSA; f->NewMultisampleEnable = ST_NEW_BLEND | ST_NEW_RASTERIZER | diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index cd70bf9..dc3f4c0 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -98,20 +98,21 @@ struct st_context boolean has_shader_model3; boolean has_etc1; boolean has_etc2; boolean prefer_blit_based_texture_transfer; boolean force_persample_in_shader; boolean has_shareable_shaders; boolean has_half_float_packing; boolean has_multi_draw_indirect; boolean has_user_constbuf; boolean can_bind_const_buffer_as_vertex; + boolean has_srgb_enable; /** * If a shader can be created when we get its source. * This means it has only 1 variant, not counting glBitmap and * glDrawPixels. */ boolean shader_has_one_variant[MESA_SHADER_STAGES]; boolean needs_texcoord_semantic; boolean apply_texture_swizzle_to_border_color; @@ -136,20 +137,21 @@ struct st_context GLuint num_sampler_views[PIPE_SHADER_TYPES]; struct pipe_clip_state clip; struct { void *ptr; unsigned size; } constants[PIPE_SHADER_TYPES]; unsigned fb_width; unsigned fb_height; unsigned fb_num_samples; unsigned fb_num_layers; + ubyte fb_srgb_buffers; struct pipe_scissor_state scissor[PIPE_MAX_VIEWPORTS]; struct pipe_viewport_state viewport[PIPE_MAX_VIEWPORTS]; struct { unsigned num; boolean include; struct pipe_scissor_state rects[PIPE_MAX_WINDOW_RECTANGLES]; } window_rects; unsigned sample_mask; GLuint poly_stipple[32]; /**< In OpenGL's bottom-to-top order */ -- 2.7.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev