1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     demo_DisplayBuffers.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/Render/demo_DisplayBuffers.h"
17 
18 namespace demo
19 {
20 
21     /* ------------------------------------------------------------------------
22         DisplayBuffersDescription class  member function
23         ------------------------------------------------------------------------ */
24 
DisplayBuffersDescription(void)25     DisplayBuffersDescription::DisplayBuffersDescription(void) :
26     m_TargetDisplay(NN_GX_DISPLAY0),
27     m_DisplayBufferNum(DEMO_DISPLAY_BUFFER_NUM),
28     m_Format(GL_RGB8_OES),
29     m_Width(nn::gx::DISPLAY0_WIDTH), m_Height(nn::gx::DISPLAY0_HEIGHT),
30     m_Area(NN_GX_MEM_FCRAM)
31     {
32     }
33 
~DisplayBuffersDescription(void)34     DisplayBuffersDescription::~DisplayBuffersDescription(void)
35     {
36     }
37 
GetDefaultDisplay0Description(void)38     DisplayBuffersDescription DisplayBuffersDescription::GetDefaultDisplay0Description(void)
39     {
40         DisplayBuffersDescription displayBuffersDesc;
41         displayBuffersDesc.m_TargetDisplay = NN_GX_DISPLAY0;
42         displayBuffersDesc.m_DisplayBufferNum = DEMO_DISPLAY_BUFFER_NUM;
43         displayBuffersDesc.m_Format = GL_RGB8_OES;
44         displayBuffersDesc.m_Width = nn::gx::DISPLAY0_WIDTH;
45         displayBuffersDesc.m_Height = nn::gx::DISPLAY0_HEIGHT;
46         displayBuffersDesc.m_Area = NN_GX_MEM_FCRAM;
47 
48         return displayBuffersDesc;
49     }
50 
GetDefaultDisplay1Description(void)51     DisplayBuffersDescription DisplayBuffersDescription::GetDefaultDisplay1Description(void)
52     {
53         DisplayBuffersDescription displayBuffersDesc;
54         displayBuffersDesc.m_TargetDisplay = NN_GX_DISPLAY1;
55         displayBuffersDesc.m_DisplayBufferNum = DEMO_DISPLAY_BUFFER_NUM;
56         displayBuffersDesc.m_Format = GL_RGB8_OES;
57         displayBuffersDesc.m_Width = nn::gx::DISPLAY1_WIDTH;
58         displayBuffersDesc.m_Height = nn::gx::DISPLAY1_HEIGHT;
59         displayBuffersDesc.m_Area = NN_GX_MEM_FCRAM;
60 
61         return displayBuffersDesc;
62     }
63 
GetDefaultDisplay0ExtDescription(void)64     DisplayBuffersDescription DisplayBuffersDescription::GetDefaultDisplay0ExtDescription(void)
65     {
66         DisplayBuffersDescription displayBuffersDesc;
67         displayBuffersDesc.m_TargetDisplay = NN_GX_DISPLAY0_EXT;
68         displayBuffersDesc.m_Format = GL_RGB8_OES;
69         displayBuffersDesc.m_Width = nn::gx::DISPLAY0_WIDTH;
70         displayBuffersDesc.m_Height = nn::gx::DISPLAY0_HEIGHT;
71         displayBuffersDesc.m_Area = NN_GX_MEM_FCRAM;
72         displayBuffersDesc.m_DisplayBufferNum = 2;
73 
74         return displayBuffersDesc;
75     }
76 
77   /* ------------------------------------------------------------------------
78         DisplayBuffers class  member function
79         ------------------------------------------------------------------------ */
80 
DisplayBuffers(void)81    DisplayBuffers::DisplayBuffers(void) :
82    m_InitializeFlag(false),
83    m_TargetDisplay(NN_GX_DISPLAY0),
84    m_DisplayBufferNum(DEMO_DISPLAY_BUFFER_NUM),
85    m_CurrentBufferIndex(0),
86    m_Width(nn::gx::DISPLAY0_WIDTH), m_Height(nn::gx::DISPLAY0_HEIGHT)
87    {
88    }
89 
~DisplayBuffers(void)90    DisplayBuffers::~DisplayBuffers(void)
91    {
92        Finalize();
93    }
94 
Initialize(const DisplayBuffersDescription & displayBufferDesc)95    void DisplayBuffers::Initialize(const DisplayBuffersDescription& displayBufferDesc)
96    {
97        if ( ! m_InitializeFlag )
98        {
99            m_TargetDisplay = displayBufferDesc.m_TargetDisplay;
100 
101            m_DisplayBufferNum = displayBufferDesc.m_DisplayBufferNum;
102 
103            m_Width = displayBufferDesc.m_Width;
104            m_Height = displayBufferDesc.m_Height;
105 
106            nngxActiveDisplay(displayBufferDesc.m_TargetDisplay);
107            nngxGenDisplaybuffers(m_DisplayBufferNum, m_DisplayBufferIdArray);
108 
109            for (u32 bufferIndex = 0; bufferIndex < m_DisplayBufferNum; bufferIndex++)
110            {
111                nngxBindDisplaybuffer(m_DisplayBufferIdArray[bufferIndex]);
112                nngxDisplaybufferStorage(displayBufferDesc.m_Format,
113                    displayBufferDesc.m_Width, displayBufferDesc.m_Height,
114                    displayBufferDesc.m_Area);
115                DEMO_ASSERT_GL_ERROR();
116            }
117 
118            nngxDisplayEnv(0, 0);
119            m_InitializeFlag = true;
120 
121            DEMO_ASSERT_GL_ERROR();
122        }
123    }
124 
Finalize(void)125    void DisplayBuffers::Finalize(void)
126    {
127        if ( m_InitializeFlag )
128        {
129            nngxBindDisplaybuffer(0);
130            DEMO_ASSERT_GL_ERROR();
131 
132            nngxDeleteDisplaybuffers(m_DisplayBufferNum, m_DisplayBufferIdArray);
133            DEMO_ASSERT_GL_ERROR();
134 
135            for (u32 bufferIndex = 0; bufferIndex < m_DisplayBufferNum; bufferIndex++)
136            {
137                m_DisplayBufferIdArray[bufferIndex] = 0;
138            }
139 
140            m_InitializeFlag = false;
141        }
142    }
143 
Create(const DisplayBuffersDescription & displayBuffersDesc,DisplayBuffers & displayBuffers)144    void DisplayBuffers::Create(const DisplayBuffersDescription& displayBuffersDesc,
145        DisplayBuffers& displayBuffers)
146    {
147        displayBuffers.Initialize(displayBuffersDesc);
148    }
149 
Destroy(DisplayBuffers & displayBuffers)150    void DisplayBuffers::Destroy(DisplayBuffers& displayBuffers)
151    {
152        displayBuffers.Finalize();
153    }
154 
GetTargetDisplayBufferId(void) const155    GLuint DisplayBuffers::GetTargetDisplayBufferId(void) const
156    {
157        return m_DisplayBufferIdArray[m_CurrentBufferIndex];
158    }
159 
GetPreviousTargetDisplayBufferId(void) const160    GLuint DisplayBuffers::GetPreviousTargetDisplayBufferId(void) const
161    {
162        if ( m_CurrentBufferIndex == 0 )
163        {
164            return m_DisplayBufferIdArray[m_DisplayBufferNum - 1];
165        }
166        else
167        {
168            return m_DisplayBufferIdArray[m_CurrentBufferIndex - 1];
169        }
170    }
171 
GetDisplayBufferId(const u32 index) const172    GLuint DisplayBuffers::GetDisplayBufferId(const u32 index) const
173    {
174        if ( index < m_DisplayBufferNum )
175        {
176            return m_DisplayBufferIdArray[m_CurrentBufferIndex];
177        }
178        else
179        {
180            return 0;
181        }
182    }
183 
Bind(void)184    void DisplayBuffers::Bind(void)
185    {
186        nngxActiveDisplay(m_TargetDisplay);
187        nngxBindDisplaybuffer(m_DisplayBufferIdArray[m_CurrentBufferIndex]);
188    }
189 
IncreaseBufferIndex(void)190    void DisplayBuffers::IncreaseBufferIndex(void)
191    {
192        m_CurrentBufferIndex++;
193        if ( m_CurrentBufferIndex >= m_DisplayBufferNum )
194        {
195            m_CurrentBufferIndex = 0;
196        }
197    }
198 
GetWidth(void) const199    u32 DisplayBuffers::GetWidth(void) const
200    {
201        return m_Width;
202    }
203 
GetHeight(void) const204    u32 DisplayBuffers::GetHeight(void) const
205    {
206        return m_Height;
207    }
208 
209 }
210