1733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt/**************************************************************************
2733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2006 VMware, Inc.
4733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * All Rights Reserved.
5733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt *
6733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a
7733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * copy of this software and associated documentation files (the
8733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * "Software"), to deal in the Software without restriction, including
9733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * without limitation the rights to use, copy, modify, merge, publish,
10733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * distribute, sub license, and/or sell copies of the Software, and to
11733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * permit persons to whom the Software is furnished to do so, subject to
12733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * the following conditions:
13733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt *
14733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * The above copyright notice and this permission notice (including the
15733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * next paragraph) shall be included in all copies or substantial portionsalloc
16733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * of the Software.
17733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt *
18733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt *
26733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt **************************************************************************/
27733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
28733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt#include "main/accum.h"
29733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt#include "main/enums.h"
30733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt#include "main/state.h"
31733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt#include "main/bufferobj.h"
32733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt#include "main/context.h"
33733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt#include "swrast/swrast.h"
34733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
35733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt#include "intel_context.h"
36733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt#include "intel_pixel.h"
37733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt#include "intel_regions.h"
38733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
39733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt#define FILE_DEBUG_FLAG DEBUG_PIXEL
40733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
41733d32f3765be84a7e908df7e99a278cadcee853Eric Anholtstatic GLenum
42733d32f3765be84a7e908df7e99a278cadcee853Eric Anholteffective_func(GLenum func, bool src_alpha_is_one)
43733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt{
44733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   if (src_alpha_is_one) {
45733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      if (func == GL_SRC_ALPHA)
46733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt	 return GL_ONE;
47733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      if (func == GL_ONE_MINUS_SRC_ALPHA)
48733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt	 return GL_ZERO;
49733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   }
50733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
51733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   return func;
52733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt}
53733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
54733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt/**
55733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * Check if any fragment operations are in effect which might effect
56733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt * glDraw/CopyPixels.
57733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt */
58733d32f3765be84a7e908df7e99a278cadcee853Eric Anholtbool
59733d32f3765be84a7e908df7e99a278cadcee853Eric Anholtintel_check_blit_fragment_ops(struct gl_context * ctx, bool src_alpha_is_one)
60733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt{
61733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   if (ctx->NewState)
62733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      _mesa_update_state(ctx);
63733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
64733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   if (ctx->FragmentProgram._Enabled) {
65733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      DBG("fallback due to fragment program\n");
66733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      return false;
67733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   }
68733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
69733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   if (ctx->Color.BlendEnabled &&
70733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt       (effective_func(ctx->Color.Blend[0].SrcRGB, src_alpha_is_one) != GL_ONE ||
71733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt	effective_func(ctx->Color.Blend[0].DstRGB, src_alpha_is_one) != GL_ZERO ||
72733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt	ctx->Color.Blend[0].EquationRGB != GL_FUNC_ADD ||
73733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt	effective_func(ctx->Color.Blend[0].SrcA, src_alpha_is_one) != GL_ONE ||
74733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt	effective_func(ctx->Color.Blend[0].DstA, src_alpha_is_one) != GL_ZERO ||
75733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt	ctx->Color.Blend[0].EquationA != GL_FUNC_ADD)) {
76733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      DBG("fallback due to blend\n");
77733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      return false;
78733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   }
79733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
80c703658b3965bf2e4f3593a0d54be03e8e8b1436Eric Anholt   if (ctx->Texture._MaxEnabledTexImageUnit != -1) {
81733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      DBG("fallback due to texturing\n");
82733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      return false;
83733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   }
84733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
85733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   if (!(ctx->Color.ColorMask[0][0] &&
86733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt	 ctx->Color.ColorMask[0][1] &&
87733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt	 ctx->Color.ColorMask[0][2] &&
88733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt	 ctx->Color.ColorMask[0][3])) {
89733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      DBG("fallback due to color masking\n");
90733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      return false;
91733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   }
92733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
93733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   if (ctx->Color.AlphaEnabled) {
94733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      DBG("fallback due to alpha\n");
95733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      return false;
96733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   }
97733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
98733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   if (ctx->Depth.Test) {
99733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      DBG("fallback due to depth test\n");
100733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      return false;
101733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   }
102733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
103733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   if (ctx->Fog.Enabled) {
104733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      DBG("fallback due to fog\n");
105733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      return false;
106733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   }
107733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
108733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   if (ctx->_ImageTransferState) {
109733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      DBG("fallback due to image transfer\n");
110733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      return false;
111733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   }
112733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
113733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   if (ctx->Stencil._Enabled) {
114733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      DBG("fallback due to image stencil\n");
115733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      return false;
116733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   }
117733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
118733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   if (ctx->RenderMode != GL_RENDER) {
119733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      DBG("fallback due to render mode\n");
120733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt      return false;
121733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   }
122733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
123733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   return true;
124733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt}
125733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
126733d32f3765be84a7e908df7e99a278cadcee853Eric Anholtvoid
127733d32f3765be84a7e908df7e99a278cadcee853Eric AnholtintelInitPixelFuncs(struct dd_function_table *functions)
128733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt{
129733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   functions->Bitmap = intelBitmap;
130733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   functions->CopyPixels = intelCopyPixels;
131733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   functions->DrawPixels = intelDrawPixels;
132733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt   functions->ReadPixels = intelReadPixels;
133733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt}
134733d32f3765be84a7e908df7e99a278cadcee853Eric Anholt
135