1 /*---------------------------------------------------------------------------* 2 Project: Horizon 3 File: gr_Texture.cpp 4 5 Copyright (C)2010 Nintendo Co., Ltd. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Rev: 25760 $ 14 *---------------------------------------------------------------------------*/ 15 16 #include <nn/gr/CTR/gr_Texture.h> 17 18 namespace nn 19 { 20 namespace gr 21 { 22 namespace CTR 23 { 24 MakeCommand(u32 * command,bool is_update_texture_func) const25 u32* Texture::Unit0::MakeCommand( u32* command, bool is_update_texture_func ) const 26 { 27 if ( is_update_texture_func ) 28 { 29 command = m_Texture.MakeFuncCommand( command ); 30 } 31 32 // 0x081 33 *command++ = borderColorR | borderColorG << 8 | borderColorB << 16 || borderColorA << 24; 34 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE0_BORDER_COLOR ); 35 36 // 0x082 37 *command++ = PICA_CMD_DATA_TEXTURE_SIZE( width, height ); 38 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE0_SIZE ); 39 40 // 0x083 41 *command++ = PICA_CMD_DATA_TEXTURE_WRAP_FILTER( magFilter, minFilter, format, wrapT, wrapS, 0, texType ); 42 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE0_WRAP_FILTER ); 43 44 if ( IsEnableMipMap() ) 45 { 46 NN_ASSERT( -16.f <= lodBias && lodBias <= 16.f ); 47 48 // 0x084 49 *command++ = PICA_CMD_DATA_TEXTURE_LOD_LEVEL( Float32ToFix13Fraction8( lodBias ), maxLodLevel, minLodLevel ); 50 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE0_LOD ); 51 } 52 else 53 { 54 *command++ = 0; 55 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE0_LOD ); 56 } 57 58 if ( texType == PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_2D ) 59 { 60 // 0x085 61 *command++ = PICA_CMD_DATA_TEXTURE_ADDR( physicalAddr ); 62 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE0_ADDR1 ); 63 } 64 else if ( texType == PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_CUBE_MAP ) 65 { 66 // 0x085 67 *command++ = PICA_CMD_DATA_TEXTURE_CUBE_MAP_ADDR( PICA_CMD_DATA_TEXTURE_ADDR( cubeMapAddrPosX ) ); 68 *command++ = PICA_CMD_HEADER_SINGLE( PICA_DATA_TEXTURE_CUBE_MAP_POSITIVE_X ); 69 70 // 0x086 71 *command++ = PICA_CMD_DATA_TEXTURE_CUBE_MAP_ADDR( PICA_CMD_DATA_TEXTURE_ADDR( cubeMapAddrNegX ) ); 72 *command++ = PICA_CMD_HEADER_SINGLE( PICA_DATA_TEXTURE_CUBE_MAP_NEGATIVE_X ); 73 74 // 0x087 75 *command++ = PICA_CMD_DATA_TEXTURE_CUBE_MAP_ADDR( PICA_CMD_DATA_TEXTURE_ADDR( cubeMapAddrPosY ) ); 76 *command++ = PICA_CMD_HEADER_SINGLE( PICA_DATA_TEXTURE_CUBE_MAP_POSITIVE_Y ); 77 78 // 0x088 79 *command++ = PICA_CMD_DATA_TEXTURE_CUBE_MAP_ADDR( PICA_CMD_DATA_TEXTURE_ADDR( cubeMapAddrNegY ) ); 80 *command++ = PICA_CMD_HEADER_SINGLE( PICA_DATA_TEXTURE_CUBE_MAP_NEGATIVE_Y ); 81 82 // 0x089 83 *command++ = PICA_CMD_DATA_TEXTURE_CUBE_MAP_ADDR( PICA_CMD_DATA_TEXTURE_ADDR( cubeMapAddrPosZ ) ); 84 *command++ = PICA_CMD_HEADER_SINGLE( PICA_DATA_TEXTURE_CUBE_MAP_POSITIVE_Z ); 85 86 // 0x08a 87 *command++ = PICA_CMD_DATA_TEXTURE_CUBE_MAP_ADDR( PICA_CMD_DATA_TEXTURE_ADDR( cubeMapAddrNegZ ) ); 88 *command++ = PICA_CMD_HEADER_SINGLE( PICA_DATA_TEXTURE_CUBE_MAP_NEGATIVE_Z ); 89 } 90 91 // 0x08e 92 *command++ = PICA_CMD_DATA_TEXTURE_FORMAT_TYPE( format ); 93 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE0_FORMAT ); 94 95 return command; 96 } 97 98 //------------------------------------------------------------------------------ MakeCommand(u32 * command,bool is_update_texture_func) const99 u32* Texture::Unit1::MakeCommand( u32* command, bool is_update_texture_func ) const 100 { 101 if ( is_update_texture_func ) 102 { 103 command = m_Texture.MakeFuncCommand( command ); 104 } 105 106 // 0x091 107 *command++ = borderColorR | borderColorG << 8 | borderColorB << 16 || borderColorA << 24; 108 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE1_BORDER_COLOR ); 109 110 // 0x092 111 *command++ = PICA_CMD_DATA_TEXTURE_SIZE( width, height ); 112 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE1_SIZE ); 113 114 // 0x093 115 *command++ = PICA_CMD_DATA_TEXTURE_WRAP_FILTER( magFilter, minFilter, format, wrapT, wrapS, 0, texType ); 116 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE1_WRAP_FILTER ); 117 118 119 if ( IsEnableMipMap() ) 120 { 121 NN_ASSERT( -16.f <= lodBias && lodBias <= 16.f ); 122 // 0x094 123 *command++ = PICA_CMD_DATA_TEXTURE_LOD_LEVEL( Float32ToFix13Fraction8( lodBias ), maxLodLevel, minLodLevel ); 124 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE1_LOD ); 125 } 126 else 127 { 128 *command++ = 0; 129 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE1_LOD ); 130 } 131 132 // 0x095 133 *command++ = PICA_CMD_DATA_TEXTURE_ADDR( physicalAddr ); 134 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE1_ADDR ); 135 136 // 0x096 137 *command++ = PICA_CMD_DATA_TEXTURE_FORMAT_TYPE( format ); 138 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE1_FORMAT ); 139 140 return command; 141 } 142 143 //------------------------------------------------------------------------------ MakeCommand(u32 * command,bool is_update_texture_func) const144 u32* Texture::Unit2::MakeCommand( u32* command, bool is_update_texture_func ) const 145 { 146 if ( is_update_texture_func ) 147 { 148 command = m_Texture.MakeFuncCommand( command ); 149 } 150 151 // 0x099 152 *command++ = borderColorR | borderColorG << 8 | borderColorB << 16 || borderColorA << 24; 153 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE2_BORDER_COLOR ); 154 155 // 0x09a 156 *command++ = PICA_CMD_DATA_TEXTURE_SIZE( width, height ); 157 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE2_SIZE ); 158 159 // 0x09b 160 *command++ = PICA_CMD_DATA_TEXTURE_WRAP_FILTER( magFilter, minFilter, format, wrapT, wrapS, 0, texType ); 161 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE2_WRAP_FILTER ); 162 163 if ( IsEnableMipMap() ) 164 { 165 NN_ASSERT( -16.f <= lodBias && lodBias <= 16.f ); 166 // 0x09c 167 *command++ = PICA_CMD_DATA_TEXTURE_LOD_LEVEL( Float32ToFix13Fraction8( lodBias ), maxLodLevel, minLodLevel ); 168 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE2_LOD ); 169 } 170 else 171 { 172 *command++ = 0; 173 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE2_LOD ); 174 } 175 176 // 0x09d 177 *command++ = PICA_CMD_DATA_TEXTURE_ADDR( physicalAddr ); 178 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE2_ADDR ); 179 180 // 0x09e 181 *command++ = PICA_CMD_DATA_TEXTURE_FORMAT_TYPE( format ); 182 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE2_FORMAT ); 183 184 return command; 185 } 186 187 //------------------------------------------------------------------------------ MakeCommand(u32 * command,bool is_update_texture_func) const188 u32* Texture::Unit3::MakeCommand( u32* command, bool is_update_texture_func ) const 189 { 190 if ( is_update_texture_func ) 191 { 192 command = m_Texture.MakeFuncCommand( command ); 193 } 194 195 return command; 196 } 197 198 //------------------------------------------------------------------------------ 199 MakeCommand(u32 * command) const200 u32* Texture::MakeCommand( u32* command ) const 201 { 202 command = MakeFuncCommand( command ); 203 command = unit0.MakeCommand( command, false ); 204 command = unit1.MakeCommand( command, false ); 205 command = unit2.MakeCommand( command, false ); 206 command = unit3.MakeCommand( command, false ); 207 208 return command; 209 } 210 211 //------------------------------------------------------------------------------ 212 MakeFuncCommand(u32 * command) const213 u32* Texture::MakeFuncCommand( u32* command ) const 214 { 215 // 0x080 216 *command++ = PICA_CMD_DATA_TEXTURE_FUNC( unit0.texType, unit1.texType, unit2.texType, 217 unit3.texCoord, unit3.texType, unit2.texCoord, 0x1), 218 *command++ = PICA_CMD_HEADER_SINGLE( PICA_REG_TEXTURE_FUNC ); 219 220 return command; 221 } 222 223 //------------------------------------------------------------------------------ 224 UnitBase()225 Texture::UnitBase::UnitBase() 226 : physicalAddr( 0 ), 227 width( 0 ), 228 height( 0 ), 229 format( PICA_DATA_TEXTURE_FORMAT_ETC1_RGB8_NATIVE_DMP ), 230 wrapT( PICA_DATA_TEXTURE_WRAP_REPEAT ), 231 wrapS( PICA_DATA_TEXTURE_WRAP_REPEAT ), 232 magFilter( PICA_DATA_TEXTURE_MAG_FILTER_NEAREST ), 233 minFilter( PICA_DATA_TEXTURE_MIN_FILTER_NEAREST ), 234 lodBias( 0.f ), 235 minLodLevel( 0 ), 236 maxLodLevel( 0 ), 237 borderColorR( 0 ), 238 borderColorG( 0 ), 239 borderColorB( 0 ), 240 borderColorA( 0 ) 241 { 242 } 243 244 //------------------------------------------------------------------------------ 245 Unit0(const Texture & texture_)246 Texture::Unit0::Unit0( const Texture& texture_ ) 247 : texType( PICA_DATA_TEXTURE0_SAMPLER_TYPE_TEXTURE_FALSE ), 248 cubeMapAddrPosX( 0 ), 249 cubeMapAddrNegX( 0 ), 250 cubeMapAddrPosY( 0 ), 251 cubeMapAddrNegY( 0 ), 252 cubeMapAddrPosZ( 0 ), 253 cubeMapAddrNegZ( 0 ), 254 m_Texture( texture_ ) 255 { 256 } 257 258 //------------------------------------------------------------------------------ 259 Unit1(const Texture & texture_)260 Texture::Unit1::Unit1( const Texture& texture_ ) 261 : texType( PICA_DATA_TEXTURE1_SAMPLER_TYPE_FALSE ), 262 m_Texture( texture_ ) 263 { 264 } 265 266 //------------------------------------------------------------------------------ 267 Unit2(const Texture & texture_)268 Texture::Unit2::Unit2( const Texture& texture_ ) 269 : texType( PICA_DATA_TEXTURE2_SAMPLER_TYPE_FALSE ), 270 texCoord( PICA_DATA_TEXTURE2_TEXCOORD_TEXTURE2 ), 271 m_Texture( texture_ ) 272 { 273 } 274 275 //------------------------------------------------------------------------------ 276 Unit3(const Texture & texture_)277 Texture::Unit3::Unit3( const Texture& texture_ ) 278 : texType( PICA_DATA_TEXTURE3_SAMPLER_TYPE_FALSE ), 279 texCoord( PICA_DATA_TEXTURE3_TEXCOORD_TEXTURE0 ), 280 m_Texture( texture_ ) 281 { 282 } 283 284 //------------------------------------------------------------------------------ 285 Texture()286 Texture::Texture() 287 : unit0( *this ), 288 unit1( *this ), 289 unit2( *this ), 290 unit3( *this ) 291 { 292 } 293 294 } // namespace CTR 295 } // namespace gr 296 } // namespace nn 297