1/* 2 * Copyright (C) 2012-2013 Rob Clark <robclark@freedesktop.org> 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 * SOFTWARE. 22 * 23 * Authors: 24 * Rob Clark <robclark@freedesktop.org> 25 */ 26 27 28#include "pipe/p_state.h" 29#include "util/u_string.h" 30#include "util/u_memory.h" 31 32#include "fd2_rasterizer.h" 33#include "fd2_context.h" 34#include "fd2_util.h" 35 36 37void * 38fd2_rasterizer_state_create(struct pipe_context *pctx, 39 const struct pipe_rasterizer_state *cso) 40{ 41 struct fd2_rasterizer_stateobj *so; 42 float psize_min, psize_max; 43 44 so = CALLOC_STRUCT(fd2_rasterizer_stateobj); 45 if (!so) 46 return NULL; 47 48 if (cso->point_size_per_vertex) { 49 psize_min = util_get_min_point_size(cso); 50 psize_max = 8192.0 - 0.0625; 51 } else { 52 /* Force the point size to be as if the vertex output was disabled. */ 53 psize_min = cso->point_size; 54 psize_max = cso->point_size; 55 } 56 57 so->base = *cso; 58 59 so->pa_sc_line_stipple = cso->line_stipple_enable ? 60 A2XX_PA_SC_LINE_STIPPLE_LINE_PATTERN(cso->line_stipple_pattern) | 61 A2XX_PA_SC_LINE_STIPPLE_REPEAT_COUNT(cso->line_stipple_factor) : 0; 62 63 so->pa_cl_clip_cntl = 0; // TODO 64 65 so->pa_su_vtx_cntl = 66 A2XX_PA_SU_VTX_CNTL_PIX_CENTER(cso->half_pixel_center ? PIXCENTER_OGL : PIXCENTER_D3D) | 67 A2XX_PA_SU_VTX_CNTL_QUANT_MODE(ONE_SIXTEENTH); 68 69 so->pa_su_point_size = 70 A2XX_PA_SU_POINT_SIZE_HEIGHT(cso->point_size/2) | 71 A2XX_PA_SU_POINT_SIZE_WIDTH(cso->point_size/2); 72 73 so->pa_su_point_minmax = 74 A2XX_PA_SU_POINT_MINMAX_MIN(psize_min/2) | 75 A2XX_PA_SU_POINT_MINMAX_MAX(psize_max/2); 76 77 so->pa_su_line_cntl = 78 A2XX_PA_SU_LINE_CNTL_WIDTH(cso->line_width/2); 79 80 so->pa_su_sc_mode_cntl = 81 A2XX_PA_SU_SC_MODE_CNTL_VTX_WINDOW_OFFSET_ENABLE | 82 A2XX_PA_SU_SC_MODE_CNTL_FRONT_PTYPE(fd_polygon_mode(cso->fill_front)) | 83 A2XX_PA_SU_SC_MODE_CNTL_BACK_PTYPE(fd_polygon_mode(cso->fill_back)); 84 85 if (cso->cull_face & PIPE_FACE_FRONT) 86 so->pa_su_sc_mode_cntl |= A2XX_PA_SU_SC_MODE_CNTL_CULL_FRONT; 87 if (cso->cull_face & PIPE_FACE_BACK) 88 so->pa_su_sc_mode_cntl |= A2XX_PA_SU_SC_MODE_CNTL_CULL_BACK; 89 if (!cso->flatshade_first) 90 so->pa_su_sc_mode_cntl |= A2XX_PA_SU_SC_MODE_CNTL_PROVOKING_VTX_LAST; 91 if (!cso->front_ccw) 92 so->pa_su_sc_mode_cntl |= A2XX_PA_SU_SC_MODE_CNTL_FACE; 93 if (cso->line_stipple_enable) 94 so->pa_su_sc_mode_cntl |= A2XX_PA_SU_SC_MODE_CNTL_LINE_STIPPLE_ENABLE; 95 if (cso->multisample) 96 so->pa_su_sc_mode_cntl |= A2XX_PA_SU_SC_MODE_CNTL_MSAA_ENABLE; 97 98 if (cso->fill_front != PIPE_POLYGON_MODE_FILL || 99 cso->fill_back != PIPE_POLYGON_MODE_FILL) 100 so->pa_su_sc_mode_cntl |= A2XX_PA_SU_SC_MODE_CNTL_POLYMODE(POLY_DUALMODE); 101 else 102 so->pa_su_sc_mode_cntl |= A2XX_PA_SU_SC_MODE_CNTL_POLYMODE(POLY_DISABLED); 103 104 if (cso->offset_tri) 105 so->pa_su_sc_mode_cntl |= 106 A2XX_PA_SU_SC_MODE_CNTL_POLY_OFFSET_FRONT_ENABLE | 107 A2XX_PA_SU_SC_MODE_CNTL_POLY_OFFSET_BACK_ENABLE | 108 A2XX_PA_SU_SC_MODE_CNTL_POLY_OFFSET_PARA_ENABLE; 109 110 return so; 111} 112