[dali_1.0.32] Merge branch 'tizen'
[platform/core/uifw/dali-core.git] / dali / internal / event / effects / shader-factory.cpp
1 /*
2  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/event/effects/shader-factory.h>
20
21 // EXTERNAL INCLUDES
22 #include <sstream>
23
24 // INTERNAL INCLUDES
25 #include <dali/internal/common/dali-hash.h>
26 #include <dali/public-api/common/dali-common.h>
27 #include <dali/integration-api/debug.h>
28 #include <dali/internal/event/resources/resource-client.h>
29 #include <dali/internal/event/effects/shader-effect-impl.h>
30 #include <dali/internal/event/effects/shader-declarations.h>
31
32 // the generated shader strings
33 #include "dali-shaders.h"
34
35 // Use pre-compiler constants in order to utilize string concatenation
36 #define SHADER_DEF_USE_BONES    "#define USE_BONES\n"
37 #define SHADER_DEF_USE_COLOR    "#define USE_COLOR\n"
38 #define SHADER_DEF_USE_GRADIENT "#define USE_GRADIENT\n"
39
40 using namespace Dali::Integration;
41
42 namespace Dali
43 {
44
45 namespace Internal
46 {
47
48 ShaderFactory::ShaderFactory(ResourceClient& resourceClient)
49 : mResourceClient(resourceClient)
50 {
51 }
52
53 ShaderFactory::~ShaderFactory()
54 {
55 }
56
57 ResourceTicketPtr ShaderFactory::Load(const std::string& vertexSource, const std::string& fragmentSource, size_t& shaderHash)
58 {
59   ResourceTicketPtr ticket;
60
61   shaderHash = CalculateHash(vertexSource, fragmentSource);
62   std::stringstream stringHash;
63   stringHash << shaderHash;
64   std::string filename = DALI_SHADERBIN_DIR;
65   filename += stringHash.str();
66   filename += ".dali-bin";
67
68   ShaderResourceType resourceType(shaderHash, vertexSource, fragmentSource);
69   ResourceTypePath typePath(resourceType, filename);
70
71   // Search for a matching resource
72   ResourceTypePathIdIter iter = mResourceTypePathIdMap.end();
73   if ( !mResourceTypePathIdMap.empty() )
74   {
75     iter = mResourceTypePathIdMap.find( typePath );
76   }
77
78   if ( mResourceTypePathIdMap.end() != iter )
79   {
80     // The resource was previously requested
81     unsigned int resourceId = iter->second;
82
83     // The ticket may still be alive, request another copy
84     ticket = mResourceClient.RequestResourceTicket( resourceId );
85
86     // Clean-up the map of resource IDs, if the ticket has been discarded
87     if ( !ticket )
88     {
89       mResourceTypePathIdMap.erase( iter );
90     }
91     else
92     {
93       DALI_LOG_INFO(Debug::Filter::gShader, Debug::General, "ShaderFactory::Load filename= %s already requested to Load\n", filename.c_str());
94     }
95   }
96
97   if ( !ticket )
98   {
99     // Load the shader (loaded synchronously in Update thread so its ready by the time the set shader message is processed)
100     ticket = mResourceClient.LoadShader(resourceType, filename);
101     DALI_LOG_INFO(Debug::Filter::gShader, Debug::General, "ShaderFactory::Load Ticket ID:%d, path: \"%s\"\n", ticket->GetId(), filename.c_str());
102
103     mResourceTypePathIdMap.insert( ResourceTypePathIdPair( typePath, ticket->GetId() ) );
104   }
105
106   return ticket;
107 }
108
109 void ShaderFactory::LoadDefaultShaders()
110 {
111   mDefaultShader = ShaderEffect::New();
112
113   mDefaultShader->SendProgramMessage( GEOMETRY_TYPE_IMAGE, SHADER_DEFAULT, ImageVertex, ImageFragment, false );
114
115   mDefaultShader->SendProgramMessage( GEOMETRY_TYPE_TEXT, SHADER_DEFAULT, TextDistanceFieldVertex, TextDistanceFieldFragment, false );
116
117   mDefaultShader->SendProgramMessage( GEOMETRY_TYPE_TEXT, SHADER_GRADIENT,
118                                       std::string( SHADER_DEF_USE_GRADIENT ) + TextDistanceFieldVertex,
119                                       std::string( SHADER_DEF_USE_GRADIENT ) + TextDistanceFieldFragment,
120                                       false );
121
122   mDefaultShader->SendProgramMessage( GEOMETRY_TYPE_TEXT, SHADER_GRADIENT_GLOW, TextDistanceFieldGlowVertex, TextDistanceFieldGlowFragment, false );
123
124   mDefaultShader->SendProgramMessage( GEOMETRY_TYPE_TEXT, SHADER_GRADIENT_SHADOW, TextDistanceFieldShadowVertex, TextDistanceFieldShadowFragment, false );
125
126   mDefaultShader->SendProgramMessage( GEOMETRY_TYPE_TEXT, SHADER_GRADIENT_OUTLINE, TextDistanceFieldOutlineVertex, TextDistanceFieldOutlineFragment, false );
127
128   mDefaultShader->SendProgramMessage( GEOMETRY_TYPE_TEXT, SHADER_GRADIENT_OUTLINE_GLOW, TextDistanceFieldOutlineGlowVertex, TextDistanceFieldOutlineGlowFragment, false );
129
130   // Untextured meshes
131   mDefaultShader->SendProgramMessage( GEOMETRY_TYPE_UNTEXTURED_MESH, SHADER_EVENLY_LIT,
132                                       UntexturedMeshVertex,
133                                       UntexturedMeshFragment,
134                                       false );
135
136   mDefaultShader->SendProgramMessage( GEOMETRY_TYPE_UNTEXTURED_MESH, SHADER_RIGGED_AND_EVENLY_LIT,
137                                       std::string( SHADER_DEF_USE_BONES ) + UntexturedMeshVertex,
138                                       UntexturedMeshFragment,
139                                       true );
140
141   mDefaultShader->SendProgramMessage( GEOMETRY_TYPE_UNTEXTURED_MESH, SHADER_RIGGED_AND_VERTEX_COLOR,
142                                       std::string( SHADER_DEF_USE_BONES SHADER_DEF_USE_COLOR ) + UntexturedMeshVertex,
143                                       std::string( SHADER_DEF_USE_COLOR ) + UntexturedMeshFragment,
144                                       true );
145
146   mDefaultShader->SendProgramMessage( GEOMETRY_TYPE_UNTEXTURED_MESH, SHADER_VERTEX_COLOR,
147                                       std::string( SHADER_DEF_USE_COLOR ) + UntexturedMeshVertex,
148                                       std::string( SHADER_DEF_USE_COLOR ) + UntexturedMeshFragment,
149                                       false );
150
151   // Textured meshes
152   mDefaultShader->SendProgramMessage( GEOMETRY_TYPE_TEXTURED_MESH, SHADER_EVENLY_LIT,
153                                       TexturedMeshVertex,
154                                       TexturedMeshFragment,
155                                       false );
156
157   mDefaultShader->SendProgramMessage( GEOMETRY_TYPE_TEXTURED_MESH, SHADER_RIGGED_AND_EVENLY_LIT,
158                                       std::string( SHADER_DEF_USE_BONES ) + TexturedMeshVertex,
159                                       TexturedMeshFragment,
160                                       true );
161 }
162
163 } // namespace Internal
164
165 } // namespace Dali