1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     demo_CommandList.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_CommandList.h"
17 
18 namespace demo
19 {
20 
21    /* ------------------------------------------------------------------------
22         CommandList class  member function
23    ------------------------------------------------------------------------ */
24 
CommandList(void)25    CommandList::CommandList(void) :
26    m_InitializeFlag(false), m_SerialRunFlag(false),
27    m_StoreCommandListIndex(0), m_RunningCommandListIndex(0),
28    m_BufferSize(0), m_RequestNum(0)
29    {
30        for (u32 index = 0; index < DEMO_COMMAND_LIST_NUM; index++)
31        {
32            m_CommandListIdArray[index] = 0;
33        }
34    }
35 
~CommandList(void)36    CommandList::~CommandList(void)
37    {
38        Finalize();
39    }
40 
Initialize(const GLsizei bufferSize,const GLsizei requestNum,const bool serialRunMode)41    void CommandList::Initialize(const GLsizei bufferSize, const GLsizei requestNum,
42        const bool serialRunMode)
43    {
44        if ( ! m_InitializeFlag )
45        {
46            DEMO_ASSERT_GL_ERROR();
47 
48            m_StoreCommandListIndex = 0;
49            m_RunningCommandListIndex = 0;
50 
51            m_BufferSize = bufferSize;
52            m_RequestNum = requestNum;
53 
54            nngxGenCmdlists(DEMO_COMMAND_LIST_NUM, &m_CommandListIdArray[0]);
55            for (u32 index = 0; index < DEMO_COMMAND_LIST_NUM; index++)
56            {
57                GLuint id = m_CommandListIdArray[index];
58                nngxBindCmdlist(id);
59                nngxCmdlistStorage(m_BufferSize, m_RequestNum);
60                DEMO_ASSERT_GL_ERROR();
61 
62                nngxSetCmdlistParameteri(NN_GX_CMDLIST_RUN_MODE, NN_GX_CMDLIST_SERIAL_RUN);
63            }
64            nngxBindCmdlist( m_CommandListIdArray[m_StoreCommandListIndex] );
65            DEMO_ASSERT_GL_ERROR();
66 
67            m_SerialRunFlag = serialRunMode;
68            if ( m_SerialRunFlag )
69            {
70                nngxRunCmdlist();
71            }
72            else
73            {
74                nngxStopCmdlist();
75            }
76            DEMO_ASSERT_GL_ERROR();
77 
78            m_InitializeFlag = true;
79        }
80    }
81 
Finalize(void)82    void CommandList::Finalize(void)
83    {
84        if ( m_InitializeFlag )
85        {
86            DEMO_ASSERT_GL_ERROR();
87 
88            Clear();
89            DEMO_ASSERT_GL_ERROR();
90 
91            nngxDeleteCmdlists(DEMO_COMMAND_LIST_NUM, &m_CommandListIdArray[0]);
92            for (u32 index = 0; index < DEMO_COMMAND_LIST_NUM; index++)
93            {
94                m_CommandListIdArray[index] = 0;
95            }
96 
97            DEMO_ASSERT_GL_ERROR();
98 
99            m_InitializeFlag = false;
100        }
101    }
102 
Run(void)103    void CommandList::Run(void)
104    {
105        RunSingle();
106 
107        DEMO_ASSERT_GL_ERROR();
108    }
109 
RunSingle(void)110    void CommandList::RunSingle(void)
111    {
112        nngxBindCmdlist( m_CommandListIdArray[m_StoreCommandListIndex] );
113        nngxSplitDrawCmdlist();
114        nngxRunCmdlist();
115        nngxWaitCmdlistDone();
116    }
117 
Swap(void)118    void CommandList::Swap(void)
119    {
120        Clear();
121 
122        if ( m_SerialRunFlag )
123        {
124            nngxRunCmdlist();
125        }
126        else
127        {
128            nngxStopCmdlist();
129        }
130 
131        m_RunningCommandListIndex = 0;
132        m_StoreCommandListIndex = 0;
133    }
134 
Stop(void)135    void CommandList::Stop(void)
136    {
137        nngxBindCmdlist( m_CommandListIdArray[m_RunningCommandListIndex] );
138    }
139 
Wait(void)140    void CommandList::Wait(void)
141    {
142        nngxBindCmdlist( m_CommandListIdArray[m_RunningCommandListIndex] );
143        nngxWaitCmdlistDone();
144 
145        if ( m_SerialRunFlag )
146        {
147            nngxRunCmdlist();
148        }
149        else
150        {
151            nngxStopCmdlist();
152        }
153    }
154 
Clear(void)155    void CommandList::Clear(void)
156    {
157        nngxBindCmdlist( m_CommandListIdArray[m_RunningCommandListIndex] );
158        nngxClearCmdlist();
159    }
160 
SetSerialRun(const bool flag)161    void CommandList::SetSerialRun(const bool flag)
162    {
163        m_SerialRunFlag = flag;
164    }
165 
166 }
167