Cleaning up some dead code with geometry scaling, rendering type declarations and...
[platform/core/uifw/dali-core.git] / dali / internal / render / gl-resources / native-texture.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/render/gl-resources/native-texture.h>
20
21 // INTERNAL INCLUDES
22 #include <dali/integration-api/debug.h>
23 #include <dali/internal/render/gl-resources/context.h>
24 #include <dali/internal/render/gl-resources/texture.h>
25 #include <dali/internal/render/gl-resources/texture-units.h>
26
27 namespace Dali
28 {
29
30 namespace Internal
31 {
32
33 NativeTexture::NativeTexture(NativeImageInterface* nativeImg, Context& context)
34 : Texture(context,
35           nativeImg->GetWidth(),
36           nativeImg->GetHeight(),
37           nativeImg->GetWidth(),
38           nativeImg->GetHeight()),
39           mNativeImage(nativeImg)
40 {
41   DALI_LOG_INFO( Debug::Filter::gImage, Debug::General, "NativeTexture created 0x%x\n", &nativeImg );
42 }
43
44 NativeTexture::~NativeTexture()
45 {
46   DALI_LOG_INFO (Debug::Filter::gImage, Debug::General, "NativeTexture destroyed\n");
47   // GlCleanup() should already have been called by TextureCache ensuring the resource is destroyed
48   // on the render thread. (And avoiding a potentially problematic virtual call in the destructor)
49 }
50
51 bool NativeTexture::Bind(GLenum target, TextureUnit textureunit )
52 {
53   bool created = false;
54
55   if( mId==0 )
56   {
57     CreateGlTexture();
58     created = true;
59   }
60
61   // Bind the texture id
62   mContext.ActiveTexture( textureunit );
63   mContext.Bind2dTexture( mId );
64
65   mNativeImage->PrepareTexture();
66
67   return created;
68 }
69
70 bool NativeTexture::IsFullyOpaque() const
71 {
72   return !HasAlphaChannel();
73 }
74
75 bool NativeTexture::HasAlphaChannel() const
76 {
77   return mNativeImage->RequiresBlending();
78 }
79
80 bool NativeTexture::CreateGlTexture()
81 {
82   if ( mId != 0 )
83   {
84     DALI_LOG_INFO( Debug::Filter::gImage, Debug::General, "GL texture creation duplicate for GL id: %d\n", &mId );
85     return true;
86   }
87
88   if( mNativeImage->GlExtensionCreate() )
89   {
90     mContext.GenTextures( 1, &mId );
91     mContext.ActiveTexture( TEXTURE_UNIT_UPLOAD );  // bind in unused unit so rebind works the first time
92     mContext.Bind2dTexture( mId );
93
94     mContext.PixelStorei( GL_UNPACK_ALIGNMENT, 1 ); // We always use tightly packed data
95
96     mContext.TexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
97     mContext.TexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
98
99     // platform specific implementation decides on what GL extension to use
100     mNativeImage->TargetTexture();
101   }
102   else
103   {
104     DALI_LOG_ERROR( "Error creating native image!" );
105   }
106
107   return mId != 0;
108 }
109
110 void NativeTexture::GlCleanup()
111 {
112   Texture::GlCleanup();
113
114   DALI_ASSERT_DEBUG( mNativeImage );
115
116   mNativeImage->GlExtensionDestroy();
117   mNativeImage.Reset();
118 }
119
120 bool NativeTexture::Init()
121 {
122   return true;
123 }
124
125 } //namespace Internal
126
127 } //namespace Dali