r300_state_inlines.h revision f02347374819a9b145a3e26c625709aea0c6f61b
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        /* XXX WTF are these?
853673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_SRC1_COLOR:
863673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_SRC1_ALPHA: */
873673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_ZERO:
883673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ZERO;
893673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_SRC_COLOR:
903673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ONE_MINUS_SRC_COLOR;
913673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_SRC_ALPHA:
923673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ONE_MINUS_SRC_ALPHA;
933673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_DST_ALPHA:
943673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ONE_MINUS_DST_ALPHA;
953673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_DST_COLOR:
963673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ONE_MINUS_DST_COLOR;
973673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_CONST_COLOR:
983673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ONE_MINUS_CONST_COLOR;
993673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_CONST_ALPHA:
1003673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_BLEND_GL_ONE_MINUS_CONST_ALPHA;
1013673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        /* XXX see above
1023673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_SRC1_COLOR:
1033673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_BLENDFACTOR_INV_SRC1_ALPHA: */
1043673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
1053673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            debug_printf("r300: Unknown blend factor %d\n", blend_fact);
1060a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
1073673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
1083673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
1093673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    return 0;
1103673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
1113673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
1123673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson/* DSA state. */
1133673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
1143673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpsonstatic INLINE uint32_t r300_translate_depth_stencil_function(int zs_func)
1153673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson{
1163673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    switch (zs_func) {
1173673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_NEVER:
1183673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_NEVER;
1193673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_LESS:
1203673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_LESS;
1213673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_EQUAL:
1223673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_EQUAL;
1233673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_LEQUAL:
1243673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_LEQUAL;
1253673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_GREATER:
1263673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_GREATER;
1273673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_NOTEQUAL:
1283673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_NOTEQUAL;
1293673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_GEQUAL:
1303673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_GEQUAL;
1313673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_ALWAYS:
1323673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_ALWAYS;
1333673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
1343673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            debug_printf("r300: Unknown depth/stencil function %d\n",
1353673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson                zs_func);
1360a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
1373673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
1383673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
1393673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    return 0;
1403673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
1413673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
1423673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpsonstatic INLINE uint32_t r300_translate_stencil_op(int s_op)
1433673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson{
1443673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    switch (s_op) {
1453673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_KEEP:
1463673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_KEEP;
1473673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_ZERO:
1483673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_ZERO;
1493673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_REPLACE:
1503673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_REPLACE;
1513673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_INCR:
1523673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_INCR;
1533673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_DECR:
1543673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_DECR;
1553673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_INCR_WRAP:
1563673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_INCR_WRAP;
1573673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_DECR_WRAP:
1583673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_DECR_WRAP;
1593673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_STENCIL_OP_INVERT:
1603673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_ZS_INVERT;
1613673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
1623673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            debug_printf("r300: Unknown stencil op %d", s_op);
1630a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
1643673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
1653673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
1663673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    return 0;
1673673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
1683673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
1693673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpsonstatic INLINE uint32_t r300_translate_alpha_function(int alpha_func)
1703673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson{
1713673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    switch (alpha_func) {
1723673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_NEVER:
1733673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_NEVER;
1743673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_LESS:
1753673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_LESS;
1763673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_EQUAL:
1773673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_EQUAL;
1783673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_LEQUAL:
1793673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_LE;
1803673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_GREATER:
1813673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_GREATER;
1823673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_NOTEQUAL:
1833673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_NOTEQUAL;
1843673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_GEQUAL:
1853673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_GE;
1863673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FUNC_ALWAYS:
1873673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_FG_ALPHA_FUNC_ALWAYS;
1883673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
1893673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            debug_printf("r300: Unknown alpha function %d", alpha_func);
1900a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
1913673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
1923673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
1933673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    return 0;
1943673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
1953673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
196a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpsonstatic INLINE uint32_t
197a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpsonr300_translate_polygon_mode_front(unsigned mode) {
198a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson    switch (mode)
199a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson    {
200a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        case PIPE_POLYGON_MODE_FILL:
201a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_FRONT_PTYPE_TRI;
202a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        case PIPE_POLYGON_MODE_LINE:
203a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_FRONT_PTYPE_LINE;
204a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        case PIPE_POLYGON_MODE_POINT:
205a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_FRONT_PTYPE_POINT;
206a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson
207a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        default:
208a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            debug_printf("r300: Bad polygon mode %i in %s\n", mode,
209a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson                __FUNCTION__);
210a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_FRONT_PTYPE_TRI;
211a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson    }
212a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson}
213a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson
214a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpsonstatic INLINE uint32_t
215a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpsonr300_translate_polygon_mode_back(unsigned mode) {
216a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson    switch (mode)
217a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson    {
218a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        case PIPE_POLYGON_MODE_FILL:
219a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_BACK_PTYPE_TRI;
220a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        case PIPE_POLYGON_MODE_LINE:
221a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_BACK_PTYPE_LINE;
222a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        case PIPE_POLYGON_MODE_POINT:
223a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_BACK_PTYPE_POINT;
224a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson
225a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson        default:
226a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            debug_printf("r300: Bad polygon mode %i in %s\n", mode,
227a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson                __FUNCTION__);
228a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson            return R300_GA_POLY_MODE_BACK_PTYPE_TRI;
229a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson    }
230a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson}
231a12fc1a9c4d544b015b40ff0266b8c8726d16f75Corbin Simpson
2323673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson/* Texture sampler state. */
2333673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
2343673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpsonstatic INLINE uint32_t r300_translate_wrap(int wrap)
2353673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson{
2363673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    switch (wrap) {
2373673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_REPEAT:
2383673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_REPEAT;
2393673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_CLAMP:
2403673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_CLAMP;
2413673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_CLAMP_TO_EDGE:
2423673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_CLAMP_TO_EDGE;
2433673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_CLAMP_TO_BORDER:
2443673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_CLAMP_TO_BORDER;
2453673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_MIRROR_REPEAT:
2463673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_REPEAT | R300_TX_MIRRORED;
2473673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_MIRROR_CLAMP:
2483673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_CLAMP | R300_TX_MIRRORED;
2493673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_EDGE:
2503673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_CLAMP_TO_EDGE | R300_TX_MIRRORED;
2513673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_WRAP_MIRROR_CLAMP_TO_BORDER:
2523673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_TX_CLAMP_TO_EDGE | R300_TX_MIRRORED;
2533673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
2543673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            debug_printf("r300: Unknown texture wrap %d", wrap);
2550a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
2563673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return 0;
2573673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
2583673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
2593673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
2603673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpsonstatic INLINE uint32_t r300_translate_tex_filters(int min, int mag, int mip)
2613673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson{
2623673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    uint32_t retval = 0;
263f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri    if (is_anisotropic)
264f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri        retval |= R300_TX_MIN_FILTER_ANISO | R300_TX_MAG_FILTER_ANISO;
265f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri    else {
266f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri        switch (min) {
2673673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_FILTER_NEAREST:
2683673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            retval |= R300_TX_MIN_FILTER_NEAREST;
269f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            break;
2703673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_FILTER_LINEAR:
2713673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            retval |= R300_TX_MIN_FILTER_LINEAR;
272f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            break;
2733673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
274f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            debug_printf("r300: Unknown texture filter %d\n", min);
2750a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
2763673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
277f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri        }
278f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri        switch (mag) {
2793673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_FILTER_NEAREST:
2803673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            retval |= R300_TX_MAG_FILTER_NEAREST;
281f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            break;
2823673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_FILTER_LINEAR:
2833673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            retval |= R300_TX_MAG_FILTER_LINEAR;
284f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            break;
2853673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
286f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            debug_printf("r300: Unknown texture filter %d\n", mag);
2870a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
2883673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
289f02347374819a9b145a3e26c625709aea0c6f61bLuca Barbieri        }
2903673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
2913673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    switch (mip) {
2923673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_MIPFILTER_NONE:
2933673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            retval |= R300_TX_MIN_FILTER_MIP_NONE;
294f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            break;
2953673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_MIPFILTER_NEAREST:
2963673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            retval |= R300_TX_MIN_FILTER_MIP_NEAREST;
297f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            break;
2983673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_TEX_MIPFILTER_LINEAR:
2993673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            retval |= R300_TX_MIN_FILTER_MIP_LINEAR;
300f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            break;
3013673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
302f78bd5922db220b1b5e21c92e6a0cb78189a77f3Corbin Simpson            debug_printf("r300: Unknown texture filter %d\n", mip);
3030a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
3043673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
3053673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
3063673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
3073673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    return retval;
3083673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
3093673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
3103673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpsonstatic INLINE uint32_t r300_anisotropy(float max_aniso)
3113673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson{
3123673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    if (max_aniso >= 16.0f) {
3133673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        return R300_TX_MAX_ANISO_16_TO_1;
3143673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    } else if (max_aniso >= 8.0f) {
3153673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        return R300_TX_MAX_ANISO_8_TO_1;
3163673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    } else if (max_aniso >= 4.0f) {
3173673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        return R300_TX_MAX_ANISO_4_TO_1;
3183673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    } else if (max_aniso >= 2.0f) {
3193673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        return R300_TX_MAX_ANISO_2_TO_1;
3203673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    } else {
3213673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        return R300_TX_MAX_ANISO_1_TO_1;
3223673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson    }
3233673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson}
3243673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
3253673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson/* Buffer formats. */
3263673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson
3270a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson/* Colorbuffer formats. This is the unswizzled format of the RB3D block's
3280a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson * output. For the swizzling of the targets, check the shader's format. */
329ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholtstatic INLINE uint32_t r300_translate_colorformat(enum pipe_format format)
330ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt{
331ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt    switch (format) {
3325f1fdaabd1686c37c45f3ad4cf125fce1df3a4a8Corbin Simpson        /* 8-bit buffers */
3333673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FORMAT_I8_UNORM:
3343673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_COLOR_FORMAT_I8;
3355f1fdaabd1686c37c45f3ad4cf125fce1df3a4a8Corbin Simpson        /* 16-bit buffers */
3363673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FORMAT_R5G6B5_UNORM:
3373673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_COLOR_FORMAT_RGB565;
3385f1fdaabd1686c37c45f3ad4cf125fce1df3a4a8Corbin Simpson        case PIPE_FORMAT_A1R5G5B5_UNORM:
3395f1fdaabd1686c37c45f3ad4cf125fce1df3a4a8Corbin Simpson            return R300_COLOR_FORMAT_ARGB1555;
3405f1fdaabd1686c37c45f3ad4cf125fce1df3a4a8Corbin Simpson        case PIPE_FORMAT_A4R4G4B4_UNORM:
3415f1fdaabd1686c37c45f3ad4cf125fce1df3a4a8Corbin Simpson            return R300_COLOR_FORMAT_ARGB4444;
3425f1fdaabd1686c37c45f3ad4cf125fce1df3a4a8Corbin Simpson        /* 32-bit buffers */
3435f1fdaabd1686c37c45f3ad4cf125fce1df3a4a8Corbin Simpson        case PIPE_FORMAT_A8R8G8B8_UNORM:
3442a929a08ab4fa4501dca88cc988cbf469b7deeb5Corbin Simpson        case PIPE_FORMAT_X8R8G8B8_UNORM:
3452a929a08ab4fa4501dca88cc988cbf469b7deeb5Corbin Simpson        case PIPE_FORMAT_R8G8B8A8_UNORM:
3462a929a08ab4fa4501dca88cc988cbf469b7deeb5Corbin Simpson        case PIPE_FORMAT_R8G8B8X8_UNORM:
3475f1fdaabd1686c37c45f3ad4cf125fce1df3a4a8Corbin Simpson            return R300_COLOR_FORMAT_ARGB8888;
3483673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        /* XXX Not in pipe_format
3493673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FORMAT_A32R32G32B32:
3503673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_COLOR_FORMAT_ARGB32323232;
3513673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FORMAT_A16R16G16B16:
352f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson            return R300_COLOR_FORMAT_ARGB16161616;
3533673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FORMAT_A10R10G10B10_UNORM:
3543673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R500_COLOR_FORMAT_ARGB10101010;
3553673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FORMAT_A2R10G10B10_UNORM:
3563673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R500_COLOR_FORMAT_ARGB2101010;
3573673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FORMAT_I10_UNORM:
3583673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R500_COLOR_FORMAT_I10; */
3593673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
360f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson            debug_printf("r300: Implementation error: "
3613673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson                "Got unsupported color format %s in %s\n",
3623673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson                pf_name(format), __FUNCTION__);
3630a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
3643673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
365ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt    }
366ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt    return 0;
367ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt}
368ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt
36904ec113e09f6287f2c6b39bf0247e06839eaf7a8Corbin Simpson/* Depthbuffer and stencilbuffer. Thankfully, we only support two flavors. */
370ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholtstatic INLINE uint32_t r300_translate_zsformat(enum pipe_format format)
371ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt{
372ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt    switch (format) {
3735f1fdaabd1686c37c45f3ad4cf125fce1df3a4a8Corbin Simpson        /* 16-bit depth, no stencil */
3743673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FORMAT_Z16_UNORM:
3753673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_DEPTHFORMAT_16BIT_INT_Z;
37604ec113e09f6287f2c6b39bf0247e06839eaf7a8Corbin Simpson        /* 24-bit depth, ignored stencil */
37704ec113e09f6287f2c6b39bf0247e06839eaf7a8Corbin Simpson        case PIPE_FORMAT_Z24X8_UNORM:
3785f1fdaabd1686c37c45f3ad4cf125fce1df3a4a8Corbin Simpson        /* 24-bit depth, 8-bit stencil */
3793673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        case PIPE_FORMAT_Z24S8_UNORM:
3803673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            return R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL;
3813673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson        default:
382f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson            debug_printf("r300: Implementation error: "
3833673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson                "Got unsupported ZS format %s in %s\n",
3843673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson                pf_name(format), __FUNCTION__);
3850a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
3863673fc35d68edf55d0b1dc0fb4c3628f228eb9d6Corbin Simpson            break;
387ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt    }
388ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt    return 0;
389ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt}
390ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt
3910a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson/* Shader output formats. This is essentially the swizzle from the shader
3920a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson * to the RB3D block.
3930a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson *
394f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson * Note that formats are stored from C3 to C0. */
395f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpsonstatic INLINE uint32_t r300_translate_out_fmt(enum pipe_format format)
396f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson{
397f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson    switch (format) {
398f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson        case PIPE_FORMAT_A8R8G8B8_UNORM:
3992a929a08ab4fa4501dca88cc988cbf469b7deeb5Corbin Simpson        case PIPE_FORMAT_X8R8G8B8_UNORM:
4000a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson        /* XXX */
40170d39c70536079eb51298086c559e4b40e6ffc03Corbin Simpson        case PIPE_FORMAT_Z24S8_UNORM:
402f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson            return R300_US_OUT_FMT_C4_8 |
403f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson                R300_C0_SEL_B | R300_C1_SEL_G |
404f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson                R300_C2_SEL_R | R300_C3_SEL_A;
4052a929a08ab4fa4501dca88cc988cbf469b7deeb5Corbin Simpson        case PIPE_FORMAT_R8G8B8A8_UNORM:
4062a929a08ab4fa4501dca88cc988cbf469b7deeb5Corbin Simpson        case PIPE_FORMAT_R8G8B8X8_UNORM:
4072a929a08ab4fa4501dca88cc988cbf469b7deeb5Corbin Simpson            return R300_US_OUT_FMT_C4_8 |
4082a929a08ab4fa4501dca88cc988cbf469b7deeb5Corbin Simpson                R300_C0_SEL_A | R300_C1_SEL_B |
4092a929a08ab4fa4501dca88cc988cbf469b7deeb5Corbin Simpson                R300_C2_SEL_G | R300_C3_SEL_R;
410f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson        default:
411f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson            debug_printf("r300: Implementation error: "
412f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson                "Got unsupported output format %s in %s\n",
413f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson                pf_name(format), __FUNCTION__);
4140a8cd4862c4f04308ab818077bab94417ffbf50bCorbin Simpson            assert(0);
415f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson            return R300_US_OUT_FMT_UNUSED;
416f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson    }
417f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson    return 0;
418f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson}
419f3f5e04103d804a23cfbe8bd264c8e0db64bd31fCorbin Simpson
420ba5f1848291e9b34e99aa54cc2c257c85c17728cCorbin Simpson/* Non-CSO state. (For now.) */
421ba5f1848291e9b34e99aa54cc2c257c85c17728cCorbin Simpson
422c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpsonstatic INLINE uint32_t r300_translate_gb_pipes(int pipe_count)
423c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson{
424c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson    switch (pipe_count) {
425c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson        case 1:
426c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            return R300_GB_TILE_PIPE_COUNT_RV300;
427c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            break;
428c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson        case 2:
429c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            return R300_GB_TILE_PIPE_COUNT_R300;
430c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            break;
431c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson        case 3:
432c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            return R300_GB_TILE_PIPE_COUNT_R420_3P;
433c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            break;
434c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson        case 4:
435c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            return R300_GB_TILE_PIPE_COUNT_R420;
436c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson            break;
437c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson    }
438c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson    return 0;
439c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson}
440c63bd15f81cecfb421ff798a3e2d0f82b90331dbCorbin Simpson
441cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson/* Utility function to count the number of components in RGBAZS formats.
442cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson * XXX should go to util or p_format.h */
443cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpsonstatic INLINE unsigned pf_component_count(enum pipe_format format) {
444cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    unsigned count = 0;
445cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
4466fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0)) {
4476fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol        count++;
448cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    }
4496fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 1)) {
4506fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol        count++;
4516fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    }
4526fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 2)) {
453cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        count++;
454cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    }
4556fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 3)) {
456cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        count++;
457cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    }
4586fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0)) {
459cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        count++;
460cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    }
4616fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1)) {
462cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        count++;
463cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    }
464cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
465cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    return count;
466cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson}
467cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
468ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpson/* Translate pipe_formats into PSC vertex types. */
469ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpsonstatic INLINE uint16_t
470ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpsonr300_translate_vertex_data_type(enum pipe_format format) {
471cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    uint32_t result = 0;
4726fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    const struct util_format_description *desc;
473cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    unsigned components = pf_component_count(format);
474cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
4756fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    desc = util_format_description(format);
4766fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol
477dfdf83d714c0d32d9182eb3001cf642aa6cb5c87Michal Krol    if (desc->layout != UTIL_FORMAT_LAYOUT_ARITH &&
478dfdf83d714c0d32d9182eb3001cf642aa6cb5c87Michal Krol        desc->layout != UTIL_FORMAT_LAYOUT_ARRAY) {
4790fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson        debug_printf("r300: Bad format %s in %s:%d\n", pf_name(format),
4800fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson            __FUNCTION__, __LINE__);
481547e939afb980c2fcc3edbbb07dba0f44be785c1Corbin Simpson        assert(0);
482cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    }
483cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
4843af2ddbe943f0fe0d6b0ba9e627cbb82d0cc79f2Michal Krol    switch (desc->channel[0].type) {
485cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        /* Half-floats, floats, doubles */
4866fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol        case UTIL_FORMAT_TYPE_FLOAT:
4876fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol            switch (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0)) {
4886fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol                case 32:
489cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    result = R300_DATA_TYPE_FLOAT_1 + (components - 1);
490cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    break;
491cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                default:
4920fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson                    debug_printf("r300: Bad format %s in %s:%d\n",
4930fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson                        pf_name(format), __FUNCTION__, __LINE__);
494cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    assert(0);
495cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson            }
496cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson            break;
4976fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol        /* Unsigned ints */
4986fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol        case UTIL_FORMAT_TYPE_UNSIGNED:
4996fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol        /* Signed ints */
5006fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol        case UTIL_FORMAT_TYPE_SIGNED:
5016fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol            switch (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0)) {
5026fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol                case 8:
503cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    result = R300_DATA_TYPE_BYTE;
504cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    break;
5056fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol                case 16:
506cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    if (components > 2) {
507cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                        result = R300_DATA_TYPE_SHORT_4;
508cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    } else {
509cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                        result = R300_DATA_TYPE_SHORT_2;
510cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    }
511cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    break;
512cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                default:
5130fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson                    debug_printf("r300: Bad format %s in %s:%d\n",
5140fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson                        pf_name(format), __FUNCTION__, __LINE__);
5156fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol                    debug_printf("r300: util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0) == %d\n",
5166fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol                        util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0));
517cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson                    assert(0);
518cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson            }
519ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpson            break;
520ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpson        default:
5210fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson            debug_printf("r300: Bad format %s in %s:%d\n",
5220fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson                pf_name(format), __FUNCTION__, __LINE__);
523ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpson            assert(0);
524ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpson    }
525cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
5263af2ddbe943f0fe0d6b0ba9e627cbb82d0cc79f2Michal Krol    if (desc->channel[0].type == UTIL_FORMAT_TYPE_SIGNED) {
527cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        result |= R300_SIGNED;
5286fd8b9b550713302566bb4c28e49c219870ccfecMichal Krol    }
529876a785a182d7987786377ff0a44ee40628254f3Michal Krol    if (desc->channel[0].normalized) {
530cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        result |= R300_NORMALIZE;
531cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    }
532cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
533cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson    return result;
534ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpson}
535ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpson
536ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpsonstatic INLINE uint16_t
537ff9e1c01989fc80f07cdc69e3e373bdfe1a384efCorbin Simpsonr300_translate_vertex_data_swizzle(enum pipe_format format) {
53872befaaae5fd9555e1f6ccbd6a74c0d640fc2929Michal Krol    const struct util_format_description *desc = util_format_description(format);
53972befaaae5fd9555e1f6ccbd6a74c0d640fc2929Michal Krol
54072befaaae5fd9555e1f6ccbd6a74c0d640fc2929Michal Krol    assert(format);
541cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
542dfdf83d714c0d32d9182eb3001cf642aa6cb5c87Michal Krol    if (desc->layout != UTIL_FORMAT_LAYOUT_ARITH &&
543dfdf83d714c0d32d9182eb3001cf642aa6cb5c87Michal Krol        desc->layout != UTIL_FORMAT_LAYOUT_ARRAY) {
5440fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson        debug_printf("r300: Bad format %s in %s:%d\n",
5450fe5f0c09abce9d540d51942eab08b2248243943Corbin Simpson            pf_name(format), __FUNCTION__, __LINE__);
546cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        return 0;
547dcd7f1c0551812cf39ca6a3af9f1610ad84fb24eCorbin Simpson    }
548cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson
54972befaaae5fd9555e1f6ccbd6a74c0d640fc2929Michal Krol    return ((desc->swizzle[0] << R300_SWIZZLE_SELECT_X_SHIFT) |
55072befaaae5fd9555e1f6ccbd6a74c0d640fc2929Michal Krol        (desc->swizzle[1] << R300_SWIZZLE_SELECT_Y_SHIFT) |
55172befaaae5fd9555e1f6ccbd6a74c0d640fc2929Michal Krol        (desc->swizzle[2] << R300_SWIZZLE_SELECT_Z_SHIFT) |
55272befaaae5fd9555e1f6ccbd6a74c0d640fc2929Michal Krol        (desc->swizzle[3] << R300_SWIZZLE_SELECT_W_SHIFT) |
553cab749a1d0046f59ca10f96d2e6343404e5f2616Corbin Simpson        (0xf << R300_WRITE_ENA_SHIFT));
554dcd7f1c0551812cf39ca6a3af9f1610ad84fb24eCorbin Simpson}
555dcd7f1c0551812cf39ca6a3af9f1610ad84fb24eCorbin Simpson
556ddc6ee316cd7ca07853efc615cd2681f3a1232d4Joakim Sindholt#endif /* R300_STATE_INLINES_H */
557