1/** 2 * \file blend.h 3 * Blending functions operations. 4 */ 5 6/* 7 * Mesa 3-D graphics library 8 * 9 * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 10 * 11 * Permission is hereby granted, free of charge, to any person obtaining a 12 * copy of this software and associated documentation files (the "Software"), 13 * to deal in the Software without restriction, including without limitation 14 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 15 * and/or sell copies of the Software, and to permit persons to whom the 16 * Software is furnished to do so, subject to the following conditions: 17 * 18 * The above copyright notice and this permission notice shall be included 19 * in all copies or substantial portions of the Software. 20 * 21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 22 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 24 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 25 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 26 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 27 * OTHER DEALINGS IN THE SOFTWARE. 28 */ 29 30 31 32#ifndef BLEND_H 33#define BLEND_H 34 35 36#include "glheader.h" 37#include "context.h" 38#include "formats.h" 39#include "extensions.h" 40 41struct gl_context; 42struct gl_framebuffer; 43 44 45extern void GLAPIENTRY 46_mesa_BlendFunc( GLenum sfactor, GLenum dfactor ); 47 48extern void GLAPIENTRY 49_mesa_BlendFunc_no_error(GLenum sfactor, GLenum dfactor); 50 51extern void GLAPIENTRY 52_mesa_BlendFuncSeparate( GLenum sfactorRGB, GLenum dfactorRGB, 53 GLenum sfactorA, GLenum dfactorA ); 54 55extern void GLAPIENTRY 56_mesa_BlendFuncSeparate_no_error(GLenum sfactorRGB, GLenum dfactorRGB, 57 GLenum sfactorA, GLenum dfactorA); 58 59extern void GLAPIENTRY 60_mesa_BlendFunciARB_no_error(GLuint buf, GLenum sfactor, GLenum dfactor); 61extern void GLAPIENTRY 62_mesa_BlendFunciARB(GLuint buf, GLenum sfactor, GLenum dfactor); 63 64 65extern void GLAPIENTRY 66_mesa_BlendFuncSeparateiARB_no_error(GLuint buf, GLenum sfactorRGB, 67 GLenum dfactorRGB, GLenum sfactorA, 68 GLenum dfactorA); 69extern void GLAPIENTRY 70_mesa_BlendFuncSeparateiARB(GLuint buf, GLenum sfactorRGB, GLenum dfactorRGB, 71 GLenum sfactorA, GLenum dfactorA); 72 73 74extern void GLAPIENTRY 75_mesa_BlendEquation( GLenum mode ); 76 77 78void GLAPIENTRY 79_mesa_BlendEquationiARB_no_error(GLuint buf, GLenum mode); 80 81extern void GLAPIENTRY 82_mesa_BlendEquationiARB(GLuint buf, GLenum mode); 83 84 85void GLAPIENTRY 86_mesa_BlendEquationSeparate_no_error(GLenum modeRGB, GLenum modeA); 87 88extern void GLAPIENTRY 89_mesa_BlendEquationSeparate( GLenum modeRGB, GLenum modeA ); 90 91 92extern void GLAPIENTRY 93_mesa_BlendEquationSeparateiARB_no_error(GLuint buf, GLenum modeRGB, 94 GLenum modeA); 95extern void GLAPIENTRY 96_mesa_BlendEquationSeparateiARB(GLuint buf, GLenum modeRGB, GLenum modeA); 97 98 99extern void GLAPIENTRY 100_mesa_BlendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); 101 102 103extern void GLAPIENTRY 104_mesa_AlphaFunc( GLenum func, GLclampf ref ); 105 106 107extern void GLAPIENTRY 108_mesa_LogicOp( GLenum opcode ); 109 110 111extern void GLAPIENTRY 112_mesa_LogicOp_no_error(GLenum opcode); 113 114 115extern void GLAPIENTRY 116_mesa_IndexMask( GLuint mask ); 117 118extern void GLAPIENTRY 119_mesa_ColorMask( GLboolean red, GLboolean green, 120 GLboolean blue, GLboolean alpha ); 121 122extern void GLAPIENTRY 123_mesa_ColorMaski( GLuint buf, GLboolean red, GLboolean green, 124 GLboolean blue, GLboolean alpha ); 125 126 127extern void GLAPIENTRY 128_mesa_ClampColor(GLenum target, GLenum clamp); 129 130extern GLboolean 131_mesa_get_clamp_fragment_color(const struct gl_context *ctx, 132 const struct gl_framebuffer *drawFb); 133 134extern GLboolean 135_mesa_get_clamp_vertex_color(const struct gl_context *ctx, 136 const struct gl_framebuffer *drawFb); 137 138extern GLboolean 139_mesa_get_clamp_read_color(const struct gl_context *ctx, 140 const struct gl_framebuffer *readFb); 141 142extern void 143_mesa_update_clamp_fragment_color(struct gl_context *ctx, 144 const struct gl_framebuffer *drawFb); 145 146extern void 147_mesa_update_clamp_vertex_color(struct gl_context *ctx, 148 const struct gl_framebuffer *drawFb); 149 150extern mesa_format 151_mesa_get_render_format(const struct gl_context *ctx, mesa_format format); 152 153extern void 154_mesa_init_color( struct gl_context * ctx ); 155 156 157static inline enum gl_advanced_blend_mode 158_mesa_get_advanced_blend_sh_constant(GLbitfield blend_enabled, 159 enum gl_advanced_blend_mode mode) 160{ 161 return blend_enabled ? mode : BLEND_NONE; 162} 163 164static inline bool 165_mesa_advanded_blend_sh_constant_changed(struct gl_context *ctx, 166 GLbitfield new_blend_enabled, 167 enum gl_advanced_blend_mode new_mode) 168{ 169 return _mesa_get_advanced_blend_sh_constant(new_blend_enabled, new_mode) != 170 _mesa_get_advanced_blend_sh_constant(ctx->Color.BlendEnabled, 171 ctx->Color._AdvancedBlendMode); 172} 173 174static inline void 175_mesa_flush_vertices_for_blend_state(struct gl_context *ctx) 176{ 177 if (!ctx->DriverFlags.NewBlend) { 178 FLUSH_VERTICES(ctx, _NEW_COLOR); 179 } else { 180 FLUSH_VERTICES(ctx, 0); 181 ctx->NewDriverState |= ctx->DriverFlags.NewBlend; 182 } 183} 184 185static inline void 186_mesa_flush_vertices_for_blend_adv(struct gl_context *ctx, 187 GLbitfield new_blend_enabled, 188 enum gl_advanced_blend_mode new_mode) 189{ 190 /* The advanced blend mode needs _NEW_COLOR to update the state constant. */ 191 if (_mesa_has_KHR_blend_equation_advanced(ctx) && 192 _mesa_advanded_blend_sh_constant_changed(ctx, new_blend_enabled, 193 new_mode)) { 194 FLUSH_VERTICES(ctx, _NEW_COLOR); 195 ctx->NewDriverState |= ctx->DriverFlags.NewBlend; 196 return; 197 } 198 _mesa_flush_vertices_for_blend_state(ctx); 199} 200 201static inline GLbitfield 202_mesa_replicate_colormask(GLbitfield mask0, unsigned num_buffers) 203{ 204 GLbitfield mask = mask0; 205 206 for (unsigned i = 1; i < num_buffers; i++) 207 mask |= mask0 << (i * 4); 208 return mask; 209} 210 211#endif 212