1bf215546Sopenharmony_ci/**************************************************************************
2bf215546Sopenharmony_ci *
3bf215546Sopenharmony_ci * Copyright 2019 VMware, Inc.
4bf215546Sopenharmony_ci * All Rights Reserved.
5bf215546Sopenharmony_ci *
6bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
7bf215546Sopenharmony_ci * copy of this software and associated documentation files (the
8bf215546Sopenharmony_ci * "Software"), to deal in the Software without restriction, including
9bf215546Sopenharmony_ci * without limitation the rights to use, copy, modify, merge, publish,
10bf215546Sopenharmony_ci * distribute, sub license, and/or sell copies of the Software, and to
11bf215546Sopenharmony_ci * permit persons to whom the Software is furnished to do so, subject to
12bf215546Sopenharmony_ci * the following conditions:
13bf215546Sopenharmony_ci *
14bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the
15bf215546Sopenharmony_ci * next paragraph) shall be included in all copies or substantial portions
16bf215546Sopenharmony_ci * of the Software.
17bf215546Sopenharmony_ci *
18bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19bf215546Sopenharmony_ci * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20bf215546Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21bf215546Sopenharmony_ci * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22bf215546Sopenharmony_ci * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23bf215546Sopenharmony_ci * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24bf215546Sopenharmony_ci * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25bf215546Sopenharmony_ci *
26bf215546Sopenharmony_ci **************************************************************************/
27bf215546Sopenharmony_ci
28bf215546Sopenharmony_ci
29bf215546Sopenharmony_ci/*
30bf215546Sopenharmony_ci * Miscellantous state tracker utility functions, macros.
31bf215546Sopenharmony_ci */
32bf215546Sopenharmony_ci
33bf215546Sopenharmony_ci
34bf215546Sopenharmony_ci#ifndef ST_UTIL
35bf215546Sopenharmony_ci#define ST_UTIL
36bf215546Sopenharmony_ci
37bf215546Sopenharmony_ci
38bf215546Sopenharmony_ci#include "state_tracker/st_context.h"
39bf215546Sopenharmony_ci
40bf215546Sopenharmony_ci
41bf215546Sopenharmony_ci#ifdef __cplusplus
42bf215546Sopenharmony_ciextern "C" {
43bf215546Sopenharmony_ci#endif
44bf215546Sopenharmony_ci
45bf215546Sopenharmony_ci
46bf215546Sopenharmony_ci/** For drawing quads for glClear, glDraw/CopyPixels, glBitmap, etc. */
47bf215546Sopenharmony_cistruct st_util_vertex
48bf215546Sopenharmony_ci{
49bf215546Sopenharmony_ci   float x, y, z;
50bf215546Sopenharmony_ci   float r, g, b, a;
51bf215546Sopenharmony_ci   float s, t;
52bf215546Sopenharmony_ci};
53bf215546Sopenharmony_ci
54bf215546Sopenharmony_ci
55bf215546Sopenharmony_ci
56bf215546Sopenharmony_ci/* Invalidate the readpixels cache to ensure we don't read stale data.
57bf215546Sopenharmony_ci */
58bf215546Sopenharmony_cistatic inline void
59bf215546Sopenharmony_cist_invalidate_readpix_cache(struct st_context *st)
60bf215546Sopenharmony_ci{
61bf215546Sopenharmony_ci   if (unlikely(st->readpix_cache.src)) {
62bf215546Sopenharmony_ci      pipe_resource_reference(&st->readpix_cache.src, NULL);
63bf215546Sopenharmony_ci      pipe_resource_reference(&st->readpix_cache.cache, NULL);
64bf215546Sopenharmony_ci   }
65bf215546Sopenharmony_ci}
66bf215546Sopenharmony_ci
67bf215546Sopenharmony_cistatic inline bool
68bf215546Sopenharmony_cist_user_clip_planes_enabled(struct gl_context *ctx)
69bf215546Sopenharmony_ci{
70bf215546Sopenharmony_ci   return (ctx->API == API_OPENGL_COMPAT ||
71bf215546Sopenharmony_ci           ctx->API == API_OPENGLES) && /* only ES 1.x */
72bf215546Sopenharmony_ci          ctx->Transform.ClipPlanesEnabled;
73bf215546Sopenharmony_ci}
74bf215546Sopenharmony_ci
75bf215546Sopenharmony_cistatic inline bool
76bf215546Sopenharmony_cist_point_size_per_vertex(struct gl_context *ctx)
77bf215546Sopenharmony_ci{
78bf215546Sopenharmony_ci   const struct gl_program *vertProg = ctx->VertexProgram._Current;
79bf215546Sopenharmony_ci   if (vertProg) {
80bf215546Sopenharmony_ci      if (vertProg->Id == 0) {
81bf215546Sopenharmony_ci         if (vertProg->info.outputs_written &
82bf215546Sopenharmony_ci             BITFIELD64_BIT(VARYING_SLOT_PSIZ)) {
83bf215546Sopenharmony_ci            /* generated program which emits point size */
84bf215546Sopenharmony_ci            return true;
85bf215546Sopenharmony_ci         }
86bf215546Sopenharmony_ci      }
87bf215546Sopenharmony_ci      else if (ctx->API != API_OPENGLES2) {
88bf215546Sopenharmony_ci         /* PointSizeEnabled is always set in ES2 contexts */
89bf215546Sopenharmony_ci         return ctx->VertexProgram.PointSizeEnabled;
90bf215546Sopenharmony_ci      }
91bf215546Sopenharmony_ci      else {
92bf215546Sopenharmony_ci         /* ST_NEW_TESSEVAL_PROGRAM | ST_NEW_GEOMETRY_PROGRAM */
93bf215546Sopenharmony_ci         /* We have to check the last bound stage and see if it writes psize */
94bf215546Sopenharmony_ci         struct gl_program *last = NULL;
95bf215546Sopenharmony_ci         if (ctx->GeometryProgram._Current)
96bf215546Sopenharmony_ci            last = ctx->GeometryProgram._Current;
97bf215546Sopenharmony_ci         else if (ctx->TessEvalProgram._Current)
98bf215546Sopenharmony_ci            last = ctx->TessEvalProgram._Current;
99bf215546Sopenharmony_ci         else if (ctx->VertexProgram._Current)
100bf215546Sopenharmony_ci            last = ctx->VertexProgram._Current;
101bf215546Sopenharmony_ci         if (last)
102bf215546Sopenharmony_ci            return !!(last->info.outputs_written &
103bf215546Sopenharmony_ci                      BITFIELD64_BIT(VARYING_SLOT_PSIZ));
104bf215546Sopenharmony_ci      }
105bf215546Sopenharmony_ci   }
106bf215546Sopenharmony_ci   return false;
107bf215546Sopenharmony_ci}
108bf215546Sopenharmony_ci
109bf215546Sopenharmony_ci#ifdef __cplusplus
110bf215546Sopenharmony_ci}
111bf215546Sopenharmony_ci#endif
112bf215546Sopenharmony_ci
113bf215546Sopenharmony_ci
114bf215546Sopenharmony_ci#endif /* ST_UTIL */
115