Home | History | Annotate | Download | only in core
      1 /****************************************************************************
      2 * Copyright (C) 2014-2015 Intel Corporation.   All Rights Reserved.
      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
     20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     21 * IN THE SOFTWARE.
     22 *
     23 * @file rasterizer.h
     24 *
     25 * @brief Definitions for the rasterizer.
     26 *
     27 ******************************************************************************/
     28 #pragma once
     29 
     30 #include "context.h"
     31 #include <type_traits>
     32 #include "conservativeRast.h"
     33 #include "multisample.h"
     34 
     35 void RasterizeLine(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t macroTile, void *pData);
     36 void RasterizeSimplePoint(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t macroTile, void *pData);
     37 void RasterizeTriPoint(DRAW_CONTEXT *pDC, uint32_t workerId, uint32_t macroTile, void *pData);
     38 
     39 INLINE
     40 __m128i fpToFixedPoint(const __m128 vIn)
     41 {
     42     __m128 vFixed = _mm_mul_ps(vIn, _mm_set1_ps(FIXED_POINT_SCALE));
     43     return _mm_cvtps_epi32(vFixed);
     44 }
     45 
     46 // Selector for correct templated RasterizeTriangle function
     47 PFN_WORK_FUNC GetRasterizerFunc(
     48     uint32_t numSamples,
     49     bool IsConservative,
     50     uint32_t InputCoverage,
     51     uint32_t EdgeEnable,
     52     bool RasterizeScissorEdges);
     53 
     54 enum ValidTriEdges
     55 {
     56     NO_VALID_EDGES = 0,
     57     E0_E1_VALID = 0x3,
     58     E0_E2_VALID = 0x5,
     59     E1_E2_VALID = 0x6,
     60     ALL_EDGES_VALID = 0x7,
     61     VALID_TRI_EDGE_COUNT,
     62 };
     63 
     64 //////////////////////////////////////////////////////////////////////////
     65 /// @brief ValidTriEdges convenience typedefs used for templated function
     66 /// specialization supported Fixed Point precisions
     67 typedef std::integral_constant<uint32_t, ALL_EDGES_VALID> AllEdgesValidT;
     68 typedef std::integral_constant<uint32_t, E0_E1_VALID> E0E1ValidT;
     69 typedef std::integral_constant<uint32_t, E0_E2_VALID> E0E2ValidT;
     70 typedef std::integral_constant<uint32_t, E1_E2_VALID> E1E2ValidT;
     71 typedef std::integral_constant<uint32_t, NO_VALID_EDGES> NoEdgesValidT;
     72 
     73 //////////////////////////////////////////////////////////////////////////
     74 /// @struct RasterScissorEdgesT
     75 /// @brief Primary RasterScissorEdgesT templated struct that holds compile
     76 /// time information about the number of edges needed to be rasterized,
     77 /// If either the scissor rect or conservative rast is enabled,
     78 /// the scissor test is enabled and the rasterizer will test
     79 /// 3 triangle edges + 4 scissor edges for coverage.
     80 /// @tparam RasterScissorEdgesT: number of multisamples
     81 /// @tparam ConservativeT: is this a conservative rasterization
     82 /// @tparam EdgeMaskT: Which edges are valid(not degenerate)
     83 template <typename RasterScissorEdgesT, typename ConservativeT, typename EdgeMaskT>
     84 struct RasterEdgeTraits
     85 {
     86     typedef std::true_type RasterizeScissorEdgesT;
     87     typedef std::integral_constant<uint32_t, 7> NumEdgesT;
     88     typedef std::integral_constant<uint32_t, EdgeMaskT::value> ValidEdgeMaskT;
     89 };
     90 
     91 //////////////////////////////////////////////////////////////////////////
     92 /// @brief specialization of RasterEdgeTraits. If neither scissor rect
     93 /// nor conservative rast is enabled, only test 3 triangle edges
     94 /// for coverage
     95 template <typename EdgeMaskT>
     96 struct RasterEdgeTraits<std::false_type, std::false_type, EdgeMaskT>
     97 {
     98     typedef std::false_type RasterizeScissorEdgesT;
     99     typedef std::integral_constant<uint32_t, 3> NumEdgesT;
    100     // no need for degenerate edge masking in non-conservative case; rasterize all triangle edges
    101     typedef std::integral_constant<uint32_t, ALL_EDGES_VALID> ValidEdgeMaskT;
    102 };
    103 
    104 //////////////////////////////////////////////////////////////////////////
    105 /// @struct RasterizerTraits
    106 /// @brief templated struct that holds compile time information used
    107 /// during rasterization. Inherits EdgeTraits and ConservativeRastBETraits.
    108 /// @tparam NumSamplesT: number of multisamples
    109 /// @tparam ConservativeT: is this a conservative rasterization
    110 /// @tparam InputCoverageT: what type of input coverage is the PS expecting?
    111 /// (only used with conservative rasterization)
    112 /// @tparam RasterScissorEdgesT: do we need to rasterize with a scissor?
    113 template <typename NumSamplesT, typename ConservativeT, typename InputCoverageT, typename EdgeEnableT, typename RasterScissorEdgesT>
    114 struct RasterizerTraits final : public ConservativeRastBETraits<ConservativeT, InputCoverageT>,
    115                                 public RasterEdgeTraits<RasterScissorEdgesT, ConservativeT, std::integral_constant<uint32_t, EdgeEnableT::value>>
    116 {
    117     typedef MultisampleTraits<static_cast<SWR_MULTISAMPLE_COUNT>(NumSamplesT::value)> MT;
    118 
    119     /// Fixed point precision the rasterizer is using
    120     typedef FixedPointTraits<Fixed_16_8> PrecisionT;
    121     /// Fixed point precision of the edge tests used during rasterization
    122     typedef FixedPointTraits<Fixed_X_16> EdgePrecisionT;
    123 
    124     // If conservative rast is enabled, only need a single sample coverage test, with the result copied to all samples
    125     typedef std::integral_constant<int, (ConservativeT::value) ? 1 : MT::numSamples> NumRasterSamplesT;
    126 
    127     static_assert(EdgePrecisionT::BitsT::value >=  ConservativeRastBETraits<ConservativeT, InputCoverageT>::ConservativePrecisionT::BitsT::value,
    128                   "Rasterizer edge fixed point precision < required conservative rast precision");
    129 
    130     /// constants used to offset between different types of raster tiles
    131     static const int colorRasterTileStep{(KNOB_TILE_X_DIM * KNOB_TILE_Y_DIM * (FormatTraits<KNOB_COLOR_HOT_TILE_FORMAT>::bpp / 8)) * MT::numSamples};
    132     static const int depthRasterTileStep{(KNOB_TILE_X_DIM * KNOB_TILE_Y_DIM * (FormatTraits<KNOB_DEPTH_HOT_TILE_FORMAT>::bpp / 8)) * MT::numSamples};
    133     static const int stencilRasterTileStep{(KNOB_TILE_X_DIM * KNOB_TILE_Y_DIM * (FormatTraits<KNOB_STENCIL_HOT_TILE_FORMAT>::bpp / 8)) * MT::numSamples};
    134     static const int colorRasterTileRowStep{(KNOB_MACROTILE_X_DIM / KNOB_TILE_X_DIM) * colorRasterTileStep};
    135     static const int depthRasterTileRowStep{(KNOB_MACROTILE_X_DIM / KNOB_TILE_X_DIM)* depthRasterTileStep};
    136     static const int stencilRasterTileRowStep{(KNOB_MACROTILE_X_DIM / KNOB_TILE_X_DIM) * stencilRasterTileStep};
    137 };
    138