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