r300_state_inlines.h revision f9f4f3df422334aee31f9041c374c72d0f97ba39
1ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt/*
2ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * Copyright 2009 Joakim Sindholt <opensource@zhasha.com>
33673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson *                Corbin Simpson <MostAwesomeDude@gmail.com>
4ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt *
5ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * Permission is hereby granted, free of charge, to any person obtaining a
6ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * copy of this software and associated documentation files (the "Software"),
7ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * to deal in the Software without restriction, including without limitation
8ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * on the rights to use, copy, modify, merge, publish, distribute, sub
9ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * license, and/or sell copies of the Software, and to permit persons to whom
10ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * the Software is furnished to do so, subject to the following conditions:
11ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt *
12ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * The above copyright notice and this permission notice (including the next
13ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * paragraph) shall be included in all copies or substantial portions of the
14ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * Software.
15ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt *
16ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
20ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt * USE OR OTHER DEALINGS IN THE SOFTWARE. */
23ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt
24ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt#ifndef R300_STATE_INLINES_H
25ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt#define R300_STATE_INLINES_H
26ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt
276a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson#include "draw/draw_vertex.h"
286a448a525baf81173f92ee8c3074b98baa54397bCorbin Simpson
29ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt#include "pipe/p_format.h"
30ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt
3172befaaae5fd9555e1f6ccbd6a74c0d640fc2929Michal Krol#include "util/u_format.h"
3272befaaae5fd9555e1f6ccbd6a74c0d640fc2929Michal Krol
33ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt#include "r300_reg.h"
34ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt
352b7d39da1f5445e1b0beb3b8b1ef9004e684c600Corbin Simpson/* Some maths. These should probably find their way to u_math, if needed. */
362b7d39da1f5445e1b0beb3b8b1ef9004e684c600Corbin Simpson
372b7d39da1f5445e1b0beb3b8b1ef9004e684c600Corbin Simpsonstatic INLINE int pack_float_16_6x(float f) {
382b7d39da1f5445e1b0beb3b8b1ef9004e684c600Corbin Simpson    return ((int)(f * 6.0) & 0xffff);
392b7d39da1f5445e1b0beb3b8b1ef9004e684c600Corbin Simpson}
402b7d39da1f5445e1b0beb3b8b1ef9004e684c600Corbin Simpson
413673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson/* Blend state. */
423673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
433673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpsonstatic INLINE uint32_t r300_translate_blend_function(int blend_func)
443673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson{
453673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    switch (blend_func) {
463673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLEND_ADD:
473673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_COMB_FCN_ADD_CLAMP;
483673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLEND_SUBTRACT:
493673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_COMB_FCN_SUB_CLAMP;
503673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLEND_REVERSE_SUBTRACT:
513673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_COMB_FCN_RSUB_CLAMP;
523673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLEND_MIN:
533673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_COMB_FCN_MIN;
543673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLEND_MAX:
553673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_COMB_FCN_MAX;
563673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
573673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            debug_printf("r300: Unknown blend function %d\n", blend_func);
580a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
593673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
603673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
613673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    return 0;
623673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
633673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
643673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson/* XXX we can also offer the D3D versions of some of these... */
653673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpsonstatic INLINE uint32_t r300_translate_blend_factor(int blend_fact)
663673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson{
673673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    switch (blend_fact) {
683673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_ONE:
693673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ONE;
703673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_SRC_COLOR:
713673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_SRC_COLOR;
723673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_SRC_ALPHA:
733673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_SRC_ALPHA;
743673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_DST_ALPHA:
753673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_DST_ALPHA;
763673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_DST_COLOR:
773673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_DST_COLOR;
783673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
793673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_SRC_ALPHA_SATURATE;
803673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_CONST_COLOR:
813673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_CONST_COLOR;
823673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_CONST_ALPHA:
833673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_CONST_ALPHA;
843673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_ZERO:
853673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ZERO;
863673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_SRC_COLOR:
873673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ONE_MINUS_SRC_COLOR;
883673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
893673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ONE_MINUS_SRC_ALPHA;
903673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_DST_ALPHA:
913673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ONE_MINUS_DST_ALPHA;
923673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_DST_COLOR:
933673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ONE_MINUS_DST_COLOR;
943673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_CONST_COLOR:
953673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ONE_MINUS_CONST_COLOR;
963673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
973673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ONE_MINUS_CONST_ALPHA;
98bfbec0818f0e7ab9358809a1af732a1366245507Corbin Simpson
99bfbec0818f0e7ab9358809a1af732a1366245507Corbin Simpson        case PIPE_BLENDFACTOR_SRC1_COLOR:
100bfbec0818f0e7ab9358809a1af732a1366245507Corbin Simpson        case PIPE_BLENDFACTOR_SRC1_ALPHA:
1013673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_SRC1_COLOR:
102bfbec0818f0e7ab9358809a1af732a1366245507Corbin Simpson        case PIPE_BLENDFACTOR_INV_SRC1_ALPHA:
103bfbec0818f0e7ab9358809a1af732a1366245507Corbin Simpson            debug_printf("r300: Implementation error: "
104bfbec0818f0e7ab9358809a1af732a1366245507Corbin Simpson                "Bad blend factor %d not supported!\n", blend_fact);
105bfbec0818f0e7ab9358809a1af732a1366245507Corbin Simpson            assert(0);
106bfbec0818f0e7ab9358809a1af732a1366245507Corbin Simpson            break;
107bfbec0818f0e7ab9358809a1af732a1366245507Corbin Simpson
1083673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
1093673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            debug_printf("r300: Unknown blend factor %d\n", blend_fact);
1100a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
1113673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
1123673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
1133673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    return 0;
1143673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
1153673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
1163673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson/* DSA state. */
1173673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
1183673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpsonstatic INLINE uint32_t r300_translate_depth_stencil_function(int zs_func)
1193673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson{
1203673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    switch (zs_func) {
1213673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_NEVER:
1223673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_NEVER;
1233673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_LESS:
1243673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_LESS;
1253673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_EQUAL:
1263673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_EQUAL;
1273673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_LEQUAL:
1283673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_LEQUAL;
1293673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_GREATER:
1303673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_GREATER;
1313673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_NOTEQUAL:
1323673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_NOTEQUAL;
1333673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_GEQUAL:
1343673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_GEQUAL;
1353673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_ALWAYS:
1363673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_ALWAYS;
1373673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
1383673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            debug_printf("r300: Unknown depth/stencil function %d\n",
1393673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson                zs_func);
1400a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
1413673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
1423673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
1433673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    return 0;
1443673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
1453673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
1463673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpsonstatic INLINE uint32_t r300_translate_stencil_op(int s_op)
1473673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson{
1483673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    switch (s_op) {
1493673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_KEEP:
1503673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_KEEP;
1513673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_ZERO:
1523673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_ZERO;
1533673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_REPLACE:
1543673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_REPLACE;
1553673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_INCR:
1563673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_INCR;
1573673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_DECR:
1583673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_DECR;
1593673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_INCR_WRAP:
1603673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_INCR_WRAP;
1613673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_DECR_WRAP:
1623673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_DECR_WRAP;
1633673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_INVERT:
1643673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_INVERT;
1653673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
1663673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            debug_printf("r300: Unknown stencil op %d", s_op);
1670a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
1683673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
1693673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
1703673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    return 0;
1713673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
1723673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
1733673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpsonstatic INLINE uint32_t r300_translate_alpha_function(int alpha_func)
1743673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson{
1753673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    switch (alpha_func) {
1763673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_NEVER:
1773673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_NEVER;
1783673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_LESS:
1793673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_LESS;
1803673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_EQUAL:
1813673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_EQUAL;
1823673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_LEQUAL:
1833673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_LE;
1843673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_GREATER:
1853673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_GREATER;
1863673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_NOTEQUAL:
1873673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_NOTEQUAL;
1883673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_GEQUAL:
1893673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_GE;
1903673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_ALWAYS:
1913673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_ALWAYS;
1923673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
1933673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            debug_printf("r300: Unknown alpha function %d", alpha_func);
1940a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
1953673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
1963673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
1973673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    return 0;
1983673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
1993673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
200a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpsonstatic INLINE uint32_t
201a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpsonr300_translate_polygon_mode_front(unsigned mode) {
202a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson    switch (mode)
203a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson    {
204a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        case PIPE_POLYGON_MODE_FILL:
205a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_FRONT_PTYPE_TRI;
206a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        case PIPE_POLYGON_MODE_LINE:
207a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_FRONT_PTYPE_LINE;
208a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        case PIPE_POLYGON_MODE_POINT:
209a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_FRONT_PTYPE_POINT;
210a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson
211a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        default:
212a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            debug_printf("r300: Bad polygon mode %i in %s\n", mode,
213a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson                __FUNCTION__);
214a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_FRONT_PTYPE_TRI;
215a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson    }
216a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson}
217a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson
218a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpsonstatic INLINE uint32_t
219a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpsonr300_translate_polygon_mode_back(unsigned mode) {
220a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson    switch (mode)
221a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson    {
222a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        case PIPE_POLYGON_MODE_FILL:
223a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_BACK_PTYPE_TRI;
224a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        case PIPE_POLYGON_MODE_LINE:
225a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_BACK_PTYPE_LINE;
226a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        case PIPE_POLYGON_MODE_POINT:
227a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_BACK_PTYPE_POINT;
228a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson
229a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        default:
230a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            debug_printf("r300: Bad polygon mode %i in %s\n", mode,
231a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson                __FUNCTION__);
232a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_BACK_PTYPE_TRI;
233a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson    }
234a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson}
235a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson
2363673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson/* Texture sampler state. */
2373673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
2383673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpsonstatic INLINE uint32_t r300_translate_wrap(int wrap)
2393673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson{
2403673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    switch (wrap) {
2413673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_REPEAT:
2423673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_REPEAT;
2433673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_CLAMP:
2443673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_CLAMP;
2453673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
2463673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_CLAMP_TO_EDGE;
2473673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
2483673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_CLAMP_TO_BORDER;
2493673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_MIRROR_REPEAT:
2503673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_REPEAT | R300_TX_MIRRORED;
2513673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_MIRROR_CLAMP:
2523673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_CLAMP | R300_TX_MIRRORED;
2533673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
2543673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_CLAMP_TO_EDGE | R300_TX_MIRRORED;
2553673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
2563673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_CLAMP_TO_EDGE | R300_TX_MIRRORED;
2573673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
2583673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            debug_printf("r300: Unknown texture wrap %d", wrap);
2590a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
2603673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return 0;
2613673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
2623673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
2633673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
26460f5608bd7027a5c26a84f1d63250353ec4ea43cBrian Paulstatic INLINE uint32_t r300_translate_tex_filters(int min, int mag, int mip,
26560f5608bd7027a5c26a84f1d63250353ec4ea43cBrian Paul                                                  int is_anisotropic)
2663673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson{
2673673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    uint32_t retval = 0;
268f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri    if (is_anisotropic)
269f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri        retval |= R300_TX_MIN_FILTER_ANISO | R300_TX_MAG_FILTER_ANISO;
270f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri    else {
271f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri        switch (min) {
2723673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_FILTER_NEAREST:
2733673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            retval |= R300_TX_MIN_FILTER_NEAREST;
274f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            break;
2753673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_FILTER_LINEAR:
2763673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            retval |= R300_TX_MIN_FILTER_LINEAR;
277f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            break;
2783673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
279f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            debug_printf("r300: Unknown texture filter %d\n", min);
2800a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
2813673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
282f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri        }
283f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri        switch (mag) {
2843673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_FILTER_NEAREST:
2853673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            retval |= R300_TX_MAG_FILTER_NEAREST;
286f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            break;
2873673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_FILTER_LINEAR:
2883673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            retval |= R300_TX_MAG_FILTER_LINEAR;
289f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            break;
2903673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
291f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            debug_printf("r300: Unknown texture filter %d\n", mag);
2920a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
2933673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
294f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri        }
2953673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
2963673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    switch (mip) {
2973673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_MIPFILTER_NONE:
2983673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            retval |= R300_TX_MIN_FILTER_MIP_NONE;
299f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            break;
3003673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_MIPFILTER_NEAREST:
3013673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            retval |= R300_TX_MIN_FILTER_MIP_NEAREST;
302f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            break;
3033673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_MIPFILTER_LINEAR:
3043673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            retval |= R300_TX_MIN_FILTER_MIP_LINEAR;
305f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            break;
3063673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
307f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            debug_printf("r300: Unknown texture filter %d\n", mip);
3080a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
3093673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
3103673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
3113673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
3123673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    return retval;
3133673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
3143673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
315ebe12d50064370e4ddec21a1e087b24295940319Roland Scheideggerstatic INLINE uint32_t r300_anisotropy(unsigned max_aniso)
3163673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson{
317ebe12d50064370e4ddec21a1e087b24295940319Roland Scheidegger    if (max_aniso >= 16) {
3183673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        return R300_TX_MAX_ANISO_16_TO_1;
319ebe12d50064370e4ddec21a1e087b24295940319Roland Scheidegger    } else if (max_aniso >= 8) {
3203673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        return R300_TX_MAX_ANISO_8_TO_1;
321ebe12d50064370e4ddec21a1e087b24295940319Roland Scheidegger    } else if (max_aniso >= 4) {
3223673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        return R300_TX_MAX_ANISO_4_TO_1;
323ebe12d50064370e4ddec21a1e087b24295940319Roland Scheidegger    } else if (max_aniso >= 2) {
3243673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        return R300_TX_MAX_ANISO_2_TO_1;
3253673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    } else {
3263673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        return R300_TX_MAX_ANISO_1_TO_1;
3273673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
3283673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
3293673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
330ba5f1848291e9b34e99aa54cc2c257c85c17728cCorbin Simpson/* Non-CSO state. (For now.) */
331ba5f1848291e9b34e99aa54cc2c257c85c17728cCorbin Simpson
332c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpsonstatic INLINE uint32_t r300_translate_gb_pipes(int pipe_count)
333c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson{
334c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson    switch (pipe_count) {
335c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson        case 1:
336c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            return R300_GB_TILE_PIPE_COUNT_RV300;
337c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            break;
338c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson        case 2:
339c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            return R300_GB_TILE_PIPE_COUNT_R300;
340c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            break;
341c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson        case 3:
342c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            return R300_GB_TILE_PIPE_COUNT_R420_3P;
343c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            break;
344c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson        case 4:
345c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            return R300_GB_TILE_PIPE_COUNT_R420;
346c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            break;
347c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson    }
348c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson    return 0;
349c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson}
350c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson
351cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson/* Utility function to count the number of components in RGBAZS formats.
352cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson * XXX should go to util or p_format.h */
353cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpsonstatic INLINE unsigned pf_component_count(enum pipe_format format) {
354cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    unsigned count = 0;
355cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
3566fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0)) {
3576fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol        count++;
358cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    }
3596fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 1)) {
3606fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol        count++;
3616fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    }
3626fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 2)) {
363cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        count++;
364cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    }
3656fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 3)) {
366cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        count++;
367cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    }
3686fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0)) {
369cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        count++;
370cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    }
3716fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1)) {
372cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        count++;
373cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    }
374cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
375cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    return count;
376cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson}
377cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
378ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpson/* Translate pipe_formats into PSC vertex types. */
379ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpsonstatic INLINE uint16_t
380ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpsonr300_translate_vertex_data_type(enum pipe_format format) {
381cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    uint32_t result = 0;
3826fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    const struct util_format_description *desc;
383cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    unsigned components = pf_component_count(format);
384cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
3856fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    desc = util_format_description(format);
3866fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol
387f9f4f3df422334aee31f9041c374c72d0f97ba39José Fonseca    if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) {
38806f76e4a6b8a3949918e55643f39525de1276815José Fonseca        debug_printf("r300: Bad format %s in %s:%d\n", util_format_name(format),
3890fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson            __FUNCTION__, __LINE__);
390547e939afb980c2fcc3edbbb07dba0f44be785c1Corbin Simpson        assert(0);
391cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    }
392cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
3933af2ddbe943f0fe0d6b0ba9e627cbb82d0cc79f2Michal Krol    switch (desc->channel[0].type) {
394cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        /* Half-floats, floats, doubles */
3956fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol        case UTIL_FORMAT_TYPE_FLOAT:
3966fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol            switch (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0)) {
397558c15995f486d72b959ad19c914a38adbcbe5f7Marek Olšák                case 16:
398558c15995f486d72b959ad19c914a38adbcbe5f7Marek Olšák                    /* XXX Supported only on RV350 and later. */
399558c15995f486d72b959ad19c914a38adbcbe5f7Marek Olšák                    if (components > 2) {
400558c15995f486d72b959ad19c914a38adbcbe5f7Marek Olšák                        result = R300_DATA_TYPE_FLT16_4;
401558c15995f486d72b959ad19c914a38adbcbe5f7Marek Olšák                    } else {
402558c15995f486d72b959ad19c914a38adbcbe5f7Marek Olšák                        result = R300_DATA_TYPE_FLT16_2;
403558c15995f486d72b959ad19c914a38adbcbe5f7Marek Olšák                    }
404558c15995f486d72b959ad19c914a38adbcbe5f7Marek Olšák                    break;
4056fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol                case 32:
406cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    result = R300_DATA_TYPE_FLOAT_1 + (components - 1);
407cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    break;
408cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                default:
4090fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson                    debug_printf("r300: Bad format %s in %s:%d\n",
41006f76e4a6b8a3949918e55643f39525de1276815José Fonseca                        util_format_name(format), __FUNCTION__, __LINE__);
411cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    assert(0);
412cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson            }
413cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson            break;
4146fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol        /* Unsigned ints */
4156fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol        case UTIL_FORMAT_TYPE_UNSIGNED:
4166fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol        /* Signed ints */
4176fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol        case UTIL_FORMAT_TYPE_SIGNED:
4186fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol            switch (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0)) {
4196fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol                case 8:
420cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    result = R300_DATA_TYPE_BYTE;
421cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    break;
4226fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol                case 16:
423cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    if (components > 2) {
424cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                        result = R300_DATA_TYPE_SHORT_4;
425cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    } else {
426cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                        result = R300_DATA_TYPE_SHORT_2;
427cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    }
428cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    break;
429cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                default:
4300fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson                    debug_printf("r300: Bad format %s in %s:%d\n",
43106f76e4a6b8a3949918e55643f39525de1276815José Fonseca                        util_format_name(format), __FUNCTION__, __LINE__);
4326fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol                    debug_printf("r300: util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0) == %d\n",
4336fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol                        util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0));
434cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    assert(0);
435cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson            }
436ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpson            break;
437ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpson        default:
4380fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson            debug_printf("r300: Bad format %s in %s:%d\n",
43906f76e4a6b8a3949918e55643f39525de1276815José Fonseca                util_format_name(format), __FUNCTION__, __LINE__);
440ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpson            assert(0);
441ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpson    }
442cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
4433af2ddbe943f0fe0d6b0ba9e627cbb82d0cc79f2Michal Krol    if (desc->channel[0].type == UTIL_FORMAT_TYPE_SIGNED) {
444cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        result |= R300_SIGNED;
4456fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    }
446876a785a182d7987786377ff0a44ee40628254f3Michal Krol    if (desc->channel[0].normalized) {
447cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        result |= R300_NORMALIZE;
448cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    }
449cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
450cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    return result;
451ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpson}
452ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpson
453ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpsonstatic INLINE uint16_t
454ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpsonr300_translate_vertex_data_swizzle(enum pipe_format format) {
45572befaaae5fd9555e1f6ccbd6a74c0d640fc2929Michal Krol    const struct util_format_description *desc = util_format_description(format);
4567d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák    unsigned swizzle[4], i;
45772befaaae5fd9555e1f6ccbd6a74c0d640fc2929Michal Krol
45872befaaae5fd9555e1f6ccbd6a74c0d640fc2929Michal Krol    assert(format);
459cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
460f9f4f3df422334aee31f9041c374c72d0f97ba39José Fonseca    if (desc->layout != UTIL_FORMAT_LAYOUT_PLAIN) {
4610fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson        debug_printf("r300: Bad format %s in %s:%d\n",
46206f76e4a6b8a3949918e55643f39525de1276815José Fonseca            util_format_name(format), __FUNCTION__, __LINE__);
463cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        return 0;
464dcd7f1c0551812cf39ca6a3af9f1610ad84fb24eCorbin Simpson    }
465cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
4667d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák    /* Swizzles for 8bits formats are in the reversed order, not sure why. */
4677d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák    if (desc->channel[0].size == 8) {
4687d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák        for (i = 0; i < 4; i++) {
469d3d41cbc3504536c2d2dfa2faaae86b2ae5eb670Marek Olšák            if (desc->swizzle[i] <= 3) {
470d3d41cbc3504536c2d2dfa2faaae86b2ae5eb670Marek Olšák                swizzle[i] = 3 - desc->swizzle[i];
471d3d41cbc3504536c2d2dfa2faaae86b2ae5eb670Marek Olšák            } else {
472d3d41cbc3504536c2d2dfa2faaae86b2ae5eb670Marek Olšák                swizzle[i] = desc->swizzle[i];
473d3d41cbc3504536c2d2dfa2faaae86b2ae5eb670Marek Olšák            }
4747d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák        }
4757d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák    } else {
4767d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák        for (i = 0; i < 4; i++) {
4777d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák            swizzle[i] = desc->swizzle[i];
4787d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák        }
4797d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák    }
4807d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák
4817d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák    return ((swizzle[0] << R300_SWIZZLE_SELECT_X_SHIFT) |
4827d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák            (swizzle[1] << R300_SWIZZLE_SELECT_Y_SHIFT) |
4837d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák            (swizzle[2] << R300_SWIZZLE_SELECT_Z_SHIFT) |
4847d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák            (swizzle[3] << R300_SWIZZLE_SELECT_W_SHIFT) |
4857d3090f0fe41757582729bb5a580ad5b9a03f765Marek Olšák            (0xf << R300_WRITE_ENA_SHIFT));
486dcd7f1c0551812cf39ca6a3af9f1610ad84fb24eCorbin Simpson}
487dcd7f1c0551812cf39ca6a3af9f1610ad84fb24eCorbin Simpson
488ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt#endif /* R300_STATE_INLINES_H */
489