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