/*---------------------------------------------------------------------------* Project: NintendoWare File: demo_DisplayBufferSwapper.h Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo and/or its licensed developers and are protected by national and international copyright laws. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. The content herein is highly confidential and should be handled accordingly. $Revision: 31311 $ *---------------------------------------------------------------------------*/ #ifndef NW_DEMO_DISPLAYBUFFERSWAPPER_H_ #define NW_DEMO_DISPLAYBUFFERSWAPPER_H_ #include #include #include #include namespace nw { namespace os { class IAllocator; } // namespace os namespace demo { //--------------------------------------------------------------------------- //! @brief スクリーンの種別を表す定義です。 //--------------------------------------------------------------------------- enum ScreenKind { UPPER_SCREEN = 0x1 << 0, //!< 上画面を表します。 LOWER_SCREEN = 0x1 << 1, //!< 下画面を表します。 EXTENSION_SCREEN = 0x1 << 2, //!< 拡張スクリーンを表します。 NORMAL_SCREENS = UPPER_SCREEN | LOWER_SCREEN, BOTH_SCREENS = UPPER_SCREEN | LOWER_SCREEN | EXTENSION_SCREEN }; //--------------------------------------------------------------------------- //! @brief ディスプレイバッファの転送モードを表す定義です。 //--------------------------------------------------------------------------- enum BufferTransferMode { TRANSFER_MODE_ANTIALIASE_NOT_USED, //!< アンチエイリアスは行いません。 TRANSFER_MODE_ANTIALIASE_2x1, //!< 2×1アンチエイリアスで転送します。 TRANSFER_MODE_ANTIALIASE_2x2, //!< 2×2アンチエイリアスで転送します。 TRANSFER_MODE_ANTIALIASE_COUNT //!< 転送モードの数を表します。 }; //--------------------------------------------------------------------------- //! @brief ディスプレイバッファの転送を行うクラスです。 //--------------------------------------------------------------------------- class DisplayBufferSwapper : public gfx::GfxObject { private: NW_DISALLOW_COPY_AND_ASSIGN(DisplayBufferSwapper); public: NW_UT_RUNTIME_TYPEINFO; //---------------------------------------- //! @name 取得/設定 //@{ //! @brief ディスプレイバッファスワッパの設定内容です。 struct Description { ScreenKind screenKind; //!< スクリーンバッファの種類です。 s32 width; //!< バッファの横幅です。 s32 height; //!< バッファの縦幅です。 gfx::RenderColorFormat format; //!< バッファのカラーフォーマットです。 BufferTransferMode transferMode;//!< バッファの転送モードです。 nw::gfx::GraphicsMemoryArea memoryArea; //!< 配置するメモリ領域です。 bool isTransferFlipX; //!< 転送時にX方向にフリップするかどうかを表します。 s32 transferOffsetX; //!< 転送を行う始点X座標です。 s32 transferOffsetY; //!< 転送を行う始点Y座標です。 s32 displayOffsetX; //!< 表示を行う始点X座標です。 s32 displayOffsetY; //!< 表示を行う始点Y座標です。 size_t bufferCount; //!< ディスプレイバッファの数です。 //! @brief コンストラクタです。 Description() : screenKind(UPPER_SCREEN), width(400), height(240), format(gfx::RENDER_COLOR_FORMAT_RGB8), transferMode(TRANSFER_MODE_ANTIALIASE_NOT_USED), memoryArea(nw::gfx::MEMORY_AREA_FCRAM), isTransferFlipX(false), transferOffsetX(0), transferOffsetY(0), displayOffsetX(0), displayOffsetY(0), bufferCount(1) {} }; //! @brief ディスプレイバッファスワッパを構築するためのクラスです。 class Builder { public: //! @brief 構築するディスプレイバッファの内容を設定します。 Builder& BufferDescription(const Description& description) { m_Description = description; return *this; } //! @brief 構築するディスプレイバッファのスクリーンを設定します。 Builder& ScreenKind(ScreenKind kind) { m_Description.screenKind = kind; return *this; } //! @brief 構築するディスプレイバッファのサイズを設定します。 Builder& BufferSize(s32 width, s32 height) { m_Description.width = width; m_Description.height = height; return *this; } //! @brief 構築するディスプレイバッファの横幅を設定します。 Builder& Width(s32 width) { m_Description.width = width; return *this; } //! @brief 構築するディスプレイバッファの縦幅を設定します。 Builder& Height(s32 height) { m_Description.height = height; return *this; } //! @brief 構築するディスプレイバッファのカラーフォーマットを設定します。 Builder& Format(gfx::RenderColorFormat format) { m_Description.format = format; return *this; } //! @brief 構築するディスプレイバッファの転送モードを設定します。 Builder& TransferMode(BufferTransferMode mode) { m_Description.transferMode = mode; return *this; } //! @brief 構築するディスプレイバッファのメモリ配置を設定します。 Builder& MemoryArea(nw::gfx::GraphicsMemoryArea area) { m_Description.memoryArea = area; return *this; } //! @brief 構築するディスプレイバッファをX方向に反転するかどうかを設定します。 Builder& IsTransferFlipX(bool isTransferFlipX) { m_Description.isTransferFlipX = isTransferFlipX; return *this; } //! @brief 構築するディスプレイバッファにカラーバッファを転送する始点を設定します。 Builder& TransferOffset(s32 x, s32 y) { m_Description.transferOffsetX = x; m_Description.transferOffsetY = y; return *this; } //! @brief 構築するディスプレイバッファの表示領域の始点を設定します。 Builder& DisplayOffset(s32 x, s32 y) { m_Description.displayOffsetX = x; m_Description.displayOffsetY = y; return *this; } //! @brief 構築するディスプレイバッファの数を設定します。 Builder& BufferCount(size_t count) { m_Description.bufferCount = count; return *this; } //--------------------------------------------------------------------------- //! @brief ディスプレイバッファスワッパを生成します。 //! //! @param[in] allocator アロケータです。 //! //! @return 生成したディスプレイバッファスワッパを返します。 //--------------------------------------------------------------------------- DisplayBufferSwapper* Create(os::IAllocator* allocator); private: Description m_Description; }; //! @brief 設定内容を取得します。 //! //! @return 設定内容を返します。 const Description& GetDescription() const { return m_Description; } //@} //--------------------------------------------------------------------------- //! @brief ディスプレイバッファにターゲットのバッファを転送するコマンドをコマンドリストに追加します。 //! //! レンダーバッファーをディスプレイバッファに転送するコマンドを生成し、 //! バインドされているコマンドリストに追加します。 //! //! コマンドリストが多重化されている場合は転送コマンドが実行されるタイミングが変わりますので、 //! 転送先のディスプレイバッファを変更します。 //! isMultiCommandList に true を指定することでこの変更は自動的に行われます。 //! //! @param[in] target ディスプレイバッファに転送するバッファです。 //! @param[in] isMultiCommandList コマンドリストが多重化されているかを指定します。 //--------------------------------------------------------------------------- void MakeTransferBufferCommand(gfx::IRenderTarget* target, bool isMultiCommandList); //--------------------------------------------------------------------------- //! @brief ディスプレイバッファを有効にします。 //--------------------------------------------------------------------------- void ActivateBuffer(); //---------------------------------------- //! @name コンストラクタ/デストラクタ //@{ private: //! コンストラクタです。 DisplayBufferSwapper( os::IAllocator* allocator, const Description& description); DisplayBufferSwapper(os::IAllocator* allocator) : GfxObject(allocator) {} protected: //! デストラクタです。 virtual ~DisplayBufferSwapper() { if (m_DisplayBuffers) { nngxDeleteDisplaybuffers( m_Description.bufferCount, m_DisplayBuffers ); nw::os::SafeFree(m_DisplayBuffers, &this->GetAllocator()); } } //@} private: Description m_Description; u32 m_CurrentDisplay; GLuint* m_DisplayBuffers; }; } // namespace demo } // namespace nw #endif // NW_DEMO_DISPLAYBUFFERSWAPPER_H_