Home | History | Annotate | Download | only in jitter
      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 fetch_jit.h
     24 *
     25 * @brief Definition of the fetch jitter
     26 *
     27 * Notes:
     28 *
     29 ******************************************************************************/
     30 #pragma once
     31 
     32 #include "common/formats.h"
     33 #include "core/state.h"
     34 
     35 //////////////////////////////////////////////////////////////////////////
     36 /// INPUT_ELEMENT_DESC
     37 //////////////////////////////////////////////////////////////////////////
     38 struct INPUT_ELEMENT_DESC
     39 {
     40     union
     41     {
     42         struct
     43         {
     44             uint32_t            AlignedByteOffset : 12;
     45             uint32_t            Format : 10;
     46             uint32_t            StreamIndex : 6;
     47             uint32_t            InstanceEnable : 1;
     48             uint32_t            ComponentControl0 : 3;
     49             uint32_t            ComponentControl1 : 3;
     50             uint32_t            ComponentControl2 : 3;
     51             uint32_t            ComponentControl3 : 3;
     52             uint32_t            ComponentPacking : 4;
     53             uint32_t            _reserved : 19;
     54         };
     55         uint64_t bits;
     56     };
     57     uint32_t InstanceDataStepRate;
     58 };
     59 
     60 // used to set ComponentPacking
     61 enum ComponentEnable
     62 {
     63     NONE = 0x0,
     64     X    = 0x1,
     65     Y    = 0x2,
     66     XY   = 0x3,
     67     Z    = 0x4,
     68     XZ   = 0x5,
     69     YZ   = 0x6,
     70     XYZ  = 0x7,
     71     W    = 0x8,
     72     XW   = 0x9,
     73     YW   = 0xA,
     74     XYW  = 0xB,
     75     ZW   = 0xC,
     76     XZW  = 0xD,
     77     YZW  = 0xE,
     78     XYZW = 0xF,
     79 };
     80 
     81 enum ComponentControl
     82 {
     83     NoStore         = 0,
     84     StoreSrc        = 1,
     85     Store0          = 2,
     86     Store1Fp        = 3,
     87     Store1Int       = 4,
     88     StoreVertexId   = 5,
     89     StoreInstanceId = 6
     90 };
     91 
     92 //////////////////////////////////////////////////////////////////////////
     93 /// State required for fetch shader jit compile.
     94 //////////////////////////////////////////////////////////////////////////
     95 struct FETCH_COMPILE_STATE
     96 {
     97     uint32_t numAttribs;
     98     INPUT_ELEMENT_DESC layout[KNOB_NUM_ATTRIBUTES];
     99     SWR_FORMAT indexType;
    100     uint32_t cutIndex{ 0xffffffff };
    101 
    102     // Options that effect the JIT'd code
    103     bool bDisableVGATHER;                   // If enabled, FetchJit will generate loads/shuffles instead of VGATHERs
    104     bool bDisableIndexOOBCheck;             // If enabled, FetchJit will exclude index OOB check
    105     bool bEnableCutIndex{ false };          // Compares indices with the cut index and returns a cut mask
    106     bool bVertexIDOffsetEnable{ false };    // Offset vertexID by StartVertex for non-indexed draws or BaseVertex for indexed draws
    107 
    108     FETCH_COMPILE_STATE(bool disableVGATHER = false, bool diableIndexOOBCheck = false):
    109         bDisableVGATHER(disableVGATHER), bDisableIndexOOBCheck(diableIndexOOBCheck){ };
    110 
    111     bool operator==(const FETCH_COMPILE_STATE &other) const
    112     {
    113         if (numAttribs != other.numAttribs) return false;
    114         if (indexType != other.indexType) return false;
    115         if (bDisableVGATHER != other.bDisableVGATHER) return false;
    116         if (bDisableIndexOOBCheck != other.bDisableIndexOOBCheck) return false;
    117         if (bEnableCutIndex != other.bEnableCutIndex) return false;
    118         if (cutIndex != other.cutIndex) return false;
    119         if (bVertexIDOffsetEnable != other.bVertexIDOffsetEnable) return false;
    120 
    121         for(uint32_t i = 0; i < numAttribs; ++i)
    122         {
    123             if((layout[i].bits != other.layout[i].bits) ||
    124                ((layout[i].InstanceEnable == 1) &&
    125                 (layout[i].InstanceDataStepRate != other.layout[i].InstanceDataStepRate))){
    126                 return false;
    127             }
    128         }
    129 
    130         return true;
    131     }
    132 };
    133