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