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