1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     demo_ShaderManager.cpp
4 
5   Copyright (C)2009-2012 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: 46365 $
14  *---------------------------------------------------------------------------*/
15 
16 #include "demo/ShaderProgram/demo_ShaderManager.h"
17 
18 extern "C"
19 {
20     extern u8* BasicVShader_SHADER_BEGIN[];
21     extern u8* BasicVShader_SHADER_END[];
22 }
23 
24 namespace demo
25 {
26 
27     /* ------------------------------------------------------------------------
28         ShaderManager class  member function
29         ------------------------------------------------------------------------ */
30 
ShaderManager(void)31     ShaderManager::ShaderManager(void) :
32     m_Initialized(false),
33     m_ColorFillProgram(), m_FontProgram(), m_DecalTextureProgram()
34     {
35     }
36 
~ShaderManager(void)37     ShaderManager::~ShaderManager(void)
38     {
39     }
40 
Initialize(void)41     bool ShaderManager::Initialize(void)
42     {
43         if ( m_Initialized )
44         {
45             return false;
46         }
47 
48         for (u32 shaderBinaryIndex = 0; shaderBinaryIndex < MAX_SHADER_BINARY_NUM;
49             shaderBinaryIndex++)
50         {
51             for (u32 shaderProgramIndex = 0; shaderProgramIndex < MAX_SHADER_PROGRAM_NUM;
52                 shaderProgramIndex++)
53             {
54                 m_ShaderProgramIdArray[shaderBinaryIndex][shaderProgramIndex] = 0;
55                 m_ShaderProgramPtrArray[shaderBinaryIndex][shaderProgramIndex] = NULL;
56             }
57         }
58 
59         m_Initialized = true;
60 
61         bool flag = InitializeBasicShader();
62         if (! flag )
63         {
64             NN_TPANIC_("Failed to initialize BasicShaderBinary.");
65         }
66 
67         return true;
68     }
69 
InitializeBasicShader(void)70     bool ShaderManager::InitializeBasicShader(void)
71     {
72         for (u32 shaderProgramIndex = 0; shaderProgramIndex < BASIC_SHADER_BINARY_SHADER_NUM;
73             shaderProgramIndex++)
74         {
75             m_ShaderProgramIdArray[BASIC_SHADER_BINARY_INDEX][shaderProgramIndex] =
76                 glCreateShader(GL_VERTEX_SHADER);
77         }
78 
79         glShaderBinary(BASIC_SHADER_BINARY_SHADER_NUM, &m_ShaderProgramIdArray[BASIC_SHADER_BINARY_INDEX][0],
80             GL_PLATFORM_BINARY_DMP,
81             BasicVShader_SHADER_BEGIN,
82             reinterpret_cast<s32>(BasicVShader_SHADER_END) -
83                 reinterpret_cast<s32>(BasicVShader_SHADER_BEGIN));
84 
85         u32 shaderBinaryIndex = BASIC_SHADER_BINARY_INDEX;
86 
87         // ColorFillShader
88         u32 shaderType = COLOR_FILL_SHADER;
89         GLuint shaderId = m_ShaderProgramIdArray[BASIC_SHADER_BINARY_INDEX][shaderType];
90         m_ColorFillProgram.Initialize(shaderId);
91         m_ShaderProgramPtrArray[shaderBinaryIndex][shaderType] = &m_ColorFillProgram;
92 
93         // FontShader
94         shaderType = FONT_SHADER;
95         shaderId = m_ShaderProgramIdArray[BASIC_SHADER_BINARY_INDEX][shaderType];
96         m_FontProgram.Initialize(shaderId);
97         m_ShaderProgramPtrArray[shaderBinaryIndex][shaderType] = &m_FontProgram;
98 
99         // DecalTextureShader
100         shaderType = DECAL_TEXTURE_SHADER;
101         shaderId = m_ShaderProgramIdArray[BASIC_SHADER_BINARY_INDEX][shaderType];
102         m_DecalTextureProgram.Initialize(shaderId);
103         m_ShaderProgramPtrArray[shaderBinaryIndex][shaderType] = &m_DecalTextureProgram;
104 
105         return true;
106     }
107 
Finalize(void)108     bool ShaderManager::Finalize(void)
109     {
110         if (! m_Initialized )
111         {
112             return false;
113         }
114 
115         for (u32 shaderBinaryIndex = 0; shaderBinaryIndex < MAX_SHADER_BINARY_NUM;
116             shaderBinaryIndex++)
117         {
118             for (u32 shaderProgramIndex = 0; shaderProgramIndex < MAX_SHADER_PROGRAM_NUM;
119                 shaderProgramIndex++)
120             {
121                 ProgramObject* programObjectPtr = m_ShaderProgramPtrArray[shaderBinaryIndex][shaderProgramIndex];
122                 if ( programObjectPtr != NULL )
123                 {
124                     programObjectPtr->Finalize();
125                 }
126             }
127         }
128 
129         m_Initialized = false;
130 
131         return true;
132     }
133 
GetVertexAttributes(const ShaderType shaderType)134     u32 ShaderManager::GetVertexAttributes(const ShaderType shaderType)
135     {
136         ProgramObject* shaderProgramPtr = GetShaderProgram(shaderType);
137         return shaderProgramPtr->GetVertexAttributes();
138     }
139 
GetShaderProgram(const ShaderType shaderType)140     ProgramObject* ShaderManager::GetShaderProgram(const ShaderType shaderType)
141     {
142         if ( ( shaderType == COLOR_FILL_SHADER ) || ( shaderType == FONT_SHADER ) || ( shaderType == DECAL_TEXTURE_SHADER ) )
143         {
144             return m_ShaderProgramPtrArray[BASIC_SHADER_BINARY_INDEX][shaderType];
145         }
146         else
147         {
148             NN_TPANIC_("GetShaderProgram() failed. Invalid shaderType = %d\n", shaderType);
149             return NULL;
150         }
151     }
152 
153 }
154