Path: blob/21.2-virgl/src/gallium/frontends/nine/nine_limits.h
4561 views
/*1* Copyright 2015 Axel Davy <[email protected]>2*3* Permission is hereby granted, free of charge, to any person obtaining a4* copy of this software and associated documentation files (the "Software"),5* to deal in the Software without restriction, including without limitation6* on the rights to use, copy, modify, merge, publish, distribute, sub7* license, and/or sell copies of the Software, and to permit persons to whom8* the Software is furnished to do so, subject to the following conditions:9*10* The above copyright notice and this permission notice (including the next11* paragraph) shall be included in all copies or substantial portions of the12* Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL17* THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,18* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR19* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE20* USE OR OTHER DEALINGS IN THE SOFTWARE. */2122#ifndef _NINE_LIMITS_H_23#define _NINE_LIMITS_H_2425#include "assert.h"26#include "d3d9types.h"2728// state can be any value29#define NINE_STATE_NO_LIMIT 030// value is clamped if below min or max31#define NINE_STATE_CLAMP 132// boolean: 0 -> false; any other value -> true33#define NINE_STATE_BOOL 234// a mask is applied on the value35#define NINE_STATE_MASK 336// if outside a range, state value is changed to a default value37#define NINE_STATE_RANGE_DEF_VAL 43839struct nine_state_behaviour {40unsigned state_value_behaviour;41union {42struct {43unsigned min;44unsigned max;45} clamp;46unsigned mask;47struct {48unsigned min;49unsigned max;50unsigned default_val;51} range_def_val;52} u;53};5455#define __NO_LIMIT_RS(o) \56[D3DRS_##o] = {NINE_STATE_NO_LIMIT}5758#define __CLAMP_RS(o, m, M) \59[D3DRS_##o] = {NINE_STATE_CLAMP, {.clamp = {m, M}}}6061#define __BOOLEAN_RS(o) \62[D3DRS_##o] = {NINE_STATE_BOOL}6364#define __MASK_RS(o, m) \65[D3DRS_##o] = {NINE_STATE_MASK, {.mask = m}}6667#define __RANGE_DEF_VAL_RS(o, m, M, d) \68[D3DRS_##o] = {NINE_STATE_RANGE_DEF_VAL, {.range_def_val = {m, M, d}}}6970#define __TO_DETERMINE_RS(o, m, M) \71[D3DRS_##o] = {NINE_STATE_NO_LIMIT}7273static const struct nine_state_behaviour74render_state_limits_table[D3DRS_BLENDOPALPHA + 1] = {75__TO_DETERMINE_RS(ZENABLE, 0, 3),76__TO_DETERMINE_RS(FILLMODE, 1, 3),77__CLAMP_RS(SHADEMODE, 1, 3),78__BOOLEAN_RS(ZWRITEENABLE),79__BOOLEAN_RS(ALPHATESTENABLE),80__BOOLEAN_RS(LASTPIXEL),81__RANGE_DEF_VAL_RS(SRCBLEND, 1, 17, D3DBLEND_ZERO),82__RANGE_DEF_VAL_RS(DESTBLEND, 1, 17, D3DBLEND_ZERO),83__CLAMP_RS(CULLMODE, 1, 3),84__CLAMP_RS(ZFUNC, 1, 8),85__MASK_RS(ALPHAREF, 0x000000FF),86__CLAMP_RS(ALPHAFUNC, 1, 8),87__BOOLEAN_RS(DITHERENABLE),88__BOOLEAN_RS(ALPHABLENDENABLE),89__BOOLEAN_RS(FOGENABLE),90__BOOLEAN_RS(SPECULARENABLE),91__NO_LIMIT_RS(FOGCOLOR),92__MASK_RS(FOGTABLEMODE, 0x00000007),93__NO_LIMIT_RS(FOGSTART), /* a bit more complex than that, lets ignore */94__NO_LIMIT_RS(FOGEND),95__NO_LIMIT_RS(FOGDENSITY), /* actually should be between 0.0 and 1.0 */96__BOOLEAN_RS(RANGEFOGENABLE),97__BOOLEAN_RS(STENCILENABLE),98__CLAMP_RS(STENCILFAIL, 1, 8),99__CLAMP_RS(STENCILZFAIL, 1, 8),100__CLAMP_RS(STENCILPASS, 1, 8),101__CLAMP_RS(STENCILFUNC, 1, 8),102__NO_LIMIT_RS(STENCILREF),103__NO_LIMIT_RS(STENCILMASK),104__NO_LIMIT_RS(STENCILWRITEMASK),105__NO_LIMIT_RS(TEXTUREFACTOR),106__TO_DETERMINE_RS(WRAP0, 0, 15),107__TO_DETERMINE_RS(WRAP1, 0, 15),108__TO_DETERMINE_RS(WRAP2, 0, 15),109__TO_DETERMINE_RS(WRAP3, 0, 15),110__TO_DETERMINE_RS(WRAP4, 0, 15),111__TO_DETERMINE_RS(WRAP5, 0, 15),112__TO_DETERMINE_RS(WRAP6, 0, 15),113__TO_DETERMINE_RS(WRAP7, 0, 15),114__BOOLEAN_RS(CLIPPING),115__BOOLEAN_RS(LIGHTING),116__NO_LIMIT_RS(AMBIENT),117__MASK_RS(FOGVERTEXMODE, 0x00000007),118__BOOLEAN_RS(COLORVERTEX),119__BOOLEAN_RS(LOCALVIEWER),120__BOOLEAN_RS(NORMALIZENORMALS),121__TO_DETERMINE_RS(DIFFUSEMATERIALSOURCE, 0, 2),122__TO_DETERMINE_RS(SPECULARMATERIALSOURCE, 0, 2),123__TO_DETERMINE_RS(AMBIENTMATERIALSOURCE, 0, 2),124__TO_DETERMINE_RS(EMISSIVEMATERIALSOURCE, 0, 2),125__TO_DETERMINE_RS(VERTEXBLEND, 0, 256), /* values between 4 and 254 -both included- are forbidden too */126__NO_LIMIT_RS(CLIPPLANEENABLE), /* expected check seems complex */127__TO_DETERMINE_RS(POINTSIZE, 0, 0xFFFFFFFF),128__TO_DETERMINE_RS(POINTSIZE_MIN, 0, 0x7FFFFFFF), /* float >= 0.0 */129__BOOLEAN_RS(POINTSPRITEENABLE),130__BOOLEAN_RS(POINTSCALEENABLE),131__TO_DETERMINE_RS(POINTSCALE_A, 0, 0x7FFFFFFF), /* float >= 0.0 */132__TO_DETERMINE_RS(POINTSCALE_B, 0, 0x7FFFFFFF), /* float >= 0.0 */133__TO_DETERMINE_RS(POINTSCALE_C, 0, 0x7FFFFFFF), /* float >= 0.0 */134__BOOLEAN_RS(MULTISAMPLEANTIALIAS),135__NO_LIMIT_RS(MULTISAMPLEMASK),136__TO_DETERMINE_RS(PATCHEDGESTYLE, 0, 1),137__TO_DETERMINE_RS(DEBUGMONITORTOKEN, 0, 1),138__TO_DETERMINE_RS(POINTSIZE_MAX, 0, 0x7FFFFFFF), /* check more complex than that */139__BOOLEAN_RS(INDEXEDVERTEXBLENDENABLE),140__TO_DETERMINE_RS(COLORWRITEENABLE, 0, 15),141__NO_LIMIT_RS(TWEENFACTOR),142__CLAMP_RS(BLENDOP, 1, 5),143__TO_DETERMINE_RS(POSITIONDEGREE, 1, 5), /* can actually be only 1 or 5 */144__TO_DETERMINE_RS(NORMALDEGREE, 1, 2),145__BOOLEAN_RS(SCISSORTESTENABLE),146__NO_LIMIT_RS(SLOPESCALEDEPTHBIAS),147__BOOLEAN_RS(ANTIALIASEDLINEENABLE),148__NO_LIMIT_RS(MINTESSELLATIONLEVEL),149__NO_LIMIT_RS(MAXTESSELLATIONLEVEL),150__NO_LIMIT_RS(ADAPTIVETESS_X),151__NO_LIMIT_RS(ADAPTIVETESS_Y),152__NO_LIMIT_RS(ADAPTIVETESS_Z),153__NO_LIMIT_RS(ADAPTIVETESS_W),154__BOOLEAN_RS(ENABLEADAPTIVETESSELLATION),155__BOOLEAN_RS(TWOSIDEDSTENCILMODE),156__CLAMP_RS(CCW_STENCILFAIL, 1, 8),157__CLAMP_RS(CCW_STENCILZFAIL, 1, 8),158__CLAMP_RS(CCW_STENCILPASS, 1, 8),159__CLAMP_RS(CCW_STENCILFUNC, 1, 8),160__TO_DETERMINE_RS(COLORWRITEENABLE1, 0, 15),161__TO_DETERMINE_RS(COLORWRITEENABLE2, 0, 15),162__TO_DETERMINE_RS(COLORWRITEENABLE3, 0, 15),163__NO_LIMIT_RS(BLENDFACTOR),164__BOOLEAN_RS(SRGBWRITEENABLE),165__NO_LIMIT_RS(DEPTHBIAS),166__TO_DETERMINE_RS(WRAP8, 0, 15),167__TO_DETERMINE_RS(WRAP9, 0, 15),168__TO_DETERMINE_RS(WRAP10, 0, 15),169__TO_DETERMINE_RS(WRAP11, 0, 15),170__TO_DETERMINE_RS(WRAP12, 0, 15),171__TO_DETERMINE_RS(WRAP13, 0, 15),172__TO_DETERMINE_RS(WRAP14, 0, 15),173__TO_DETERMINE_RS(WRAP15, 0, 15),174__BOOLEAN_RS(SEPARATEALPHABLENDENABLE),175__RANGE_DEF_VAL_RS(SRCBLENDALPHA, 1, 17, D3DBLEND_ZERO),176__RANGE_DEF_VAL_RS(DESTBLENDALPHA, 1, 17, D3DBLEND_ZERO),177__CLAMP_RS(BLENDOPALPHA, 1, 5)178};179180static DWORD inline181nine_fix_render_state_value(D3DRENDERSTATETYPE State,182DWORD Value)183{184struct nine_state_behaviour behaviour = render_state_limits_table[State];185186switch (behaviour.state_value_behaviour) {187case NINE_STATE_NO_LIMIT:188break;189case NINE_STATE_CLAMP:190if (Value < behaviour.u.clamp.min)191Value = behaviour.u.clamp.min;192else if (Value > behaviour.u.clamp.max)193Value = behaviour.u.clamp.max;194break;195case NINE_STATE_BOOL:196Value = Value ? 1 : 0;197break;198case NINE_STATE_MASK:199Value = Value & behaviour.u.mask;200break;201case NINE_STATE_RANGE_DEF_VAL:202if (Value < behaviour.u.range_def_val.min || Value > behaviour.u.range_def_val.max)203Value = behaviour.u.range_def_val.default_val;204break;205}206207return Value;208}209210struct nine_limits211{212unsigned min;213unsigned max;214};215216#define __VALUE_SAMP(o, m, M) \217[D3DSAMP_##o] = {m, M}218219static const struct nine_limits220sampler_state_limits_table[D3DRS_BLENDOPALPHA + 1] = {221__VALUE_SAMP(ADDRESSU, 1, 5),222__VALUE_SAMP(ADDRESSV, 1, 5),223__VALUE_SAMP(ADDRESSW, 1, 5),224__VALUE_SAMP(BORDERCOLOR, 0, 0xFFFFFFFF),225__VALUE_SAMP(MAGFILTER, 0, 8), /* 4-5 should be forbidden */226__VALUE_SAMP(MINFILTER, 0, 8), /* same */227__VALUE_SAMP(MIPFILTER, 0, 8), /* same */228__VALUE_SAMP(MIPMAPLODBIAS, 0, 0xFFFFFFFF),229__VALUE_SAMP(MAXMIPLEVEL, 0, 0xFFFFFFFF),230__VALUE_SAMP(MAXANISOTROPY, 1, 0xFFFFFFFF), /* Max value should be pCaps->MaxAnisotropy */231__VALUE_SAMP(SRGBTEXTURE, 0, 1),232__VALUE_SAMP(ELEMENTINDEX, 0, 0xFFFFFFFF),233__VALUE_SAMP(DMAPOFFSET, 0, 0xFFFFFFFF)234};235236static BOOL inline237nine_check_sampler_state_value(D3DSAMPLERSTATETYPE State,238DWORD Value)239{240struct nine_limits limit;241242limit = sampler_state_limits_table[State];243return (limit.min <= Value && Value <= limit.max);244}245246#endif /* _NINE_HELPERS_H_ */247248249