1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     SmCommandReuser.h
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  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   $Revision: 18422 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef SM_COMMAND_REUSER_H_
17 #define SM_COMMAND_REUSER_H_
18 
19 #include <nn/gx.h>
20 
21 //---------------------------------------------------------------------------
22 // コマンドを作って再利用するクラスです。
23 class SmCommandReuser
24 {
25 public:
SmCommandReuser()26     SmCommandReuser()
27     : m_StoreCommandListId(0),
28       m_CommandListId(0),
29       m_BufferOffset(0),
30       m_BufferSize(0),
31       m_RequestId(0),
32       m_RequestSize(0)
33     {}
34 
35     // キャッシュ作成を開始します。
StartCaching(GLuint cachingCommandListId)36     void StartCaching(GLuint cachingCommandListId)
37     {
38         // 現在バインドされているコマンドリストをストア
39         nngxGetCmdlistParameteri( NN_GX_CMDLIST_BINDING, &m_StoreCommandListId );
40 
41         // キャッシュ用のコマンドリストへ切り替え
42         m_CommandListId = cachingCommandListId;
43         nngxBindCmdlist(cachingCommandListId);
44         nngxClearCmdlist();
45         nngxStartCmdlistSave();
46         NW_GL_ASSERT();
47     }
48 
49     // キャッシュ作成を終了します。
EndCaching()50     void EndCaching()
51     {
52         nngxSplitDrawCmdlist();
53         NW_GL_ASSERT();
54 
55         nngxStopCmdlistSave(
56             &this->m_BufferOffset,
57             &this->m_BufferSize,
58             &this->m_RequestId,
59             &this->m_RequestSize);
60         NW_GL_ASSERT();
61 
62         nngxBindCmdlist( m_StoreCommandListId );
63     }
64 
65     // キャッシュしたコマンドを使用します。
UseCommand(bool isCopyBuffer)66     void UseCommand( bool isCopyBuffer )
67     {
68         GLboolean copyBuffer = isCopyBuffer ? GL_TRUE : GL_FALSE;
69         nngxUseSavedCmdlist(
70             this->m_CommandListId,
71             this->m_BufferOffset,
72             this->m_BufferSize,
73             this->m_RequestId,
74             this->m_RequestSize,
75             0,
76             copyBuffer);
77         NW_GL_ASSERT();
78     }
79 
80     // キャッシュされているか?
IsCach()81     bool IsCach()
82     {
83         if( m_BufferSize > 0 )
84         {
85             return true;
86         }
87         else
88         {
89             return false;
90         }
91     }
92 
GetBufferSize()93     GLsizei GetBufferSize() const
94     {
95         return m_BufferSize;
96     }
97 
98 private:
99     GLint       m_StoreCommandListId;
100     GLuint      m_CommandListId;
101     GLuint      m_BufferOffset;
102     GLsizei     m_BufferSize;
103     GLuint      m_RequestId;
104     GLsizei     m_RequestSize;
105 };
106 
107 
108 
109 //---------------------------------------------------------------------------
110 // 静的なコマンドキャッシュ領域を確保し、コマンドを登録します。
111 class SmStaticCommandCach
112 {
113 public:
114 
115     // コンストラクタ
SmStaticCommandCach()116     SmStaticCommandCach()
117     {
118         nngxGenCmdlists(1, &(m_CachingCommandList));
119         nngxBindCmdlist(m_CachingCommandList);
120         nngxCmdlistStorage(description.cachingCommandBufferSize, description.cachingRequestCount);
121         nngxSetCmdlistParameteri(NN_GX_CMDLIST_RUN_MODE, NN_GX_CMDLIST_SERIAL_RUN);
122     }
123 
124 
125 };
126 
127 #endif // SM_COMMAND_REUSER_H_
128