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