genesis-3d_engine/Engine/rendersystem/null/RenderDeviceNull.cc
zhongdaohuan 6e8fbca745 genesis-3d engine version 1.3.
match the genesis editor version 1.3.0.653.
2014-05-05 14:50:33 +08:00

460 lines
14 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/****************************************************************************
Copyright (c) 2011-2013,WebJet Business Division,CYOU
http://www.genesis-3d.com.cn
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
****************************************************************************/
#if __WIN32__
#include "stdneb.h"
#include "d3d9/D3D9Types.h"
#include "d3d9/RenderTargetD3D9.h"
#include "null/RenderDeviceNull.h"
namespace NullDevice
{
using namespace RenderBase;
using namespace D3D9;
typedef IDirect3D9* (WINAPI* Direct3DCreate9Func)(UINT);
__ImplementClass(RenderTargetNull, 'RDTN', RenderTarget);
__ImplementClass(RenderDeviceNull, 'RDVN', RenderDevice);
__ImplementThreadSingleton(RenderDeviceNull);
NullWindow::NullWindow( RenderDeviceNull* device, HWND winHandle)
: RenderBase::RenderWindow( winHandle )
{
}
NullWindow::~NullWindow()
{
}
void NullWindow::BeginRender()
{
}
void NullWindow::EndRender()
{
}
//------------------------------------------------------------------------------
void RenderTargetNull::AssignResolveTextures()
{
if (this->isDefaultRenderTarget)
{
return;
}
this->resolveTexture = Texture::Create();
n_assert(this->resolveTexture.isvalid());
this->resolveTexture->Setup();
}
//------------------------------------------------------------------------
RenderDeviceNull::RenderDeviceNull():
m_iD3D9( NULL ),
m_iDevice9( NULL ),
m_iBackBufferSurface9( NULL ),
m_iCurrentSwapChain( NULL ),
m_hMainWindow( NULL ),
m_hHiddenWindow( NULL ),
m_instD3D9Dll( NULL ),
m_bWindowed( true ),
m_bDeviceLost( false ),
m_bNeedReset( false ),
m_adapterCount( D3DADAPTER_DEFAULT ),
m_displayFormat( D3DFMT_X8R8G8B8 ),
m_deviceType(D3DDEVTYPE_HAL)
{
__ConstructThreadSingleton;
m_defaultDisplayPresentParams.BackBufferCount = 1;
m_defaultDisplayPresentParams.Windowed = m_bWindowed;
m_defaultDisplayPresentParams.BackBufferFormat = m_displayFormat;
m_defaultDisplayPresentParams.BackBufferWidth = 1024;
m_defaultDisplayPresentParams.BackBufferHeight = 768;
m_defaultDisplayPresentParams.EnableAutoDepthStencil = FALSE;
m_defaultDisplayPresentParams.AutoDepthStencilFormat = D3DFMT_D24S8;
m_defaultDisplayPresentParams.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
m_defaultDisplayPresentParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_defaultDisplayPresentParams.hDeviceWindow = (HWND)m_hMainWindow;
m_defaultDisplayPresentParams.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
m_defaultDisplayPresentParams.MultiSampleType = D3DMULTISAMPLE_NONE;
m_defaultDisplayPresentParams.MultiSampleQuality = 0;
m_defaultDisplayPresentParams.Flags = 0;
m_deviceBehaviourFlags = D3DCREATE_FPU_PRESERVE | D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
//------------------------------------------------------------------------
RenderDeviceNull::~RenderDeviceNull()
{
__DestructThreadSingleton;
}
//------------------------------------------------------------------------
bool RenderDeviceNull::CreateD3DObjectAndHiddenWindow()
{
m_instD3D9Dll = LoadLibrary( "d3d9.dll" );
if (!m_instD3D9Dll)
{
n_error("RenderDeviceD3D9::CreateD3DObjectAndHiddenWindow: No D3D9Runtime Installed\n");
m_instD3D9Dll = NULL;
return false;
}
Direct3DCreate9Func d3dcreateFunc = (Direct3DCreate9Func)GetProcAddress( m_instD3D9Dll, "Direct3DCreate9");
if( !d3dcreateFunc )
{
n_error( "RenderDeviceD3D9::CreateD3DObjectAndHiddenWindow: Direct3DCreate9 Not Found\n" );
FreeLibrary( m_instD3D9Dll );
m_instD3D9Dll = NULL;
return false;
}
m_iD3D9 = d3dcreateFunc( D3D_SDK_VERSION );
if ( !m_iD3D9 )
{
n_error("RenderDeviceD3D9::CreateD3DObjectAndHiddenWindow: D3D9 Version Is Not Correct");
m_iD3D9 = NULL;
return false;
}
//Create Hidden Window
m_hHiddenWindow = CreateWindowW(
L"STATIC",
L"GenesisHiddenWindow",
WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
0, 0, 1, 1,
NULL, NULL,
GetModuleHandle(0), NULL );
if( !m_hHiddenWindow )
{
n_error("RenderDeviceD3D9::CreateD3DObjectAndHiddenWindow: Create Hidden Window Failed!");
return false;
}
return true;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetupDisplayParams()
{
// backbuffer <20>ĸ<EFBFBD>ʽ<EFBFBD>ʹ<EFBFBD>С<EFBFBD><D0A1><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD>
m_defaultDisplayPresentParams.hDeviceWindow = m_hHiddenWindow;
m_defaultDisplayPresentParams.BackBufferFormat = D3D9::D3D9Types::AsD3D9PixelFormat(RenderBase::PixelFormat::X8R8G8B8);
m_defaultDisplayPresentParams.BackBufferHeight = 800;
m_defaultDisplayPresentParams.BackBufferWidth = 600;
}
//----------------------------------------------------------------------
bool RenderDeviceNull::InitDevice()
{
if(!CreateD3DObjectAndHiddenWindow())
return false;
SetupDisplayParams();
HRESULT hr = m_iD3D9->CreateDevice(m_adapterCount,
D3DDEVTYPE_HAL,
m_hHiddenWindow,
m_deviceBehaviourFlags,
&m_defaultDisplayPresentParams,
&m_iDevice9
);
if (FAILED(hr))
{
n_error("Failed to create Direct3D device object: %s!\n", DXGetErrorString9(hr));
return false;
}
return true;
}
//------------------------------------------------------------------------
float RenderDeviceNull::GetHorizontalTexelOffset()
{
return -0.5f;
}
//------------------------------------------------------------------------
float RenderDeviceNull::GetVerticalTexelOffset()
{
return -0.5f;
}
//------------------------------------------------------------------------
float RenderDeviceNull::GetMinimumDepthInputValue()
{
return 0.0f;
}
//------------------------------------------------------------------------
float RenderDeviceNull::GetMaximumDepthInputValue()
{
return -1.0f;
}
//------------------------------------------------------------------------
void RenderDeviceNull::DetectGraphicCardCaps()
{
//m_graphicCardCaps.DetectGraphicCardCapsD3D9();
}
//------------------------------------------------------------------------
const GraphicCardCapability& RenderDeviceNull::GetGraphicCardCapability()
{
return m_graphicCardCaps;
}
//------------------------------------------------------------------------
void RenderDeviceNull::UpdateTexture(RenderBase::Texture::UpdateFunction texUpdateFunc,GPtr<Texture> destTex, void* tag)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::UpdateTexture(GPtr<Texture> srcTex, GPtr<Texture> destTex)
{
return;
}
//------------------------------------------------------------------------
const GPtr<GPUProgram> RenderDeviceNull::CreateRenderGPUProgram(const GPtr<GPUProgram>& srcGPUProgram)
{
return GPUProgram::Create();
}
//------------------------------------------------------------------------
const GPtr<RenderStateDesc> RenderDeviceNull::CreateRenderState(const GPtr<RenderStateDesc>& state)
{
return RenderStateDesc::Create();
}
//------------------------------------------------------------------------
const GPtr<Texture> RenderDeviceNull::CreateRenderSideTexture( GPtr<Texture> tex)
{
return Texture::Create();
}
//------------------------------------------------------------------------
const GPtr<RenderTarget> RenderDeviceNull::CreateRenderTarget(const GPtr<RenderTarget>& rt)
{
GPtr<RenderTargetNull> rtD9 = RenderTargetNull::Create();
rtD9->AssignResolveTextures();
return rtD9.upcast<RenderTarget>();
}
//------------------------------------------------------------------------
const GPtr<MultipleRenderTarget> RenderDeviceNull::CreateMultipleRenderTarget(const GPtr<MultipleRenderTarget>& mrt)
{
return MultipleRenderTarget::Create();
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetBlendState(const DeviceBlendState& state)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetRasterState(const DeviceRasterizerState& state)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetDepthAndStencilState(const DeviceDepthAndStencilState& state)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetTextureSamplerState(const DeviceSamplerState& state)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetTexture(const Texture* tex)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetRenderTarget(RenderTarget* rt)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetMultipleRenderTarget(const MultipleRenderTarget* mrt, bool resume )
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::DisableRenderTarget(int index)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetVertexShaderConstantVectorF(const int& reg, float* val, const int& vec4count)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetPixelShaderConstantVectorF(const int& reg, float* val, const int& vec4count)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetVertexShaderConstantFloat(const int& reg, float* val)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetPixelShaderConstantFloat(const int& reg, float* val)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetVertexShaderConstantMatrixF(const int& reg, float* val, const int& matrixCount)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetPixelShaderConstantMatrixF(const int& reg, float* val, const int& matrixCount)
{
return;
}
//------------------------------------------------------------------------
bool RenderDeviceNull::BeginFrame()
{
HRESULT hr;
if (m_bDeviceLost)
{
SetupDisplayParams();
Sleep(100);
bool bRealDeviceLost = false;
while ( FAILED(hr = m_iDevice9->TestCooperativeLevel()))
{
if (hr == D3DERR_DEVICELOST)
{
bRealDeviceLost = true;
Sleep(100);
continue;
}
if (hr == D3DERR_DEVICENOTRESET)
{
bRealDeviceLost = true;
//if(!_OnDeviceLost())
{
continue;
}
}
}
if (false == bRealDeviceLost)
{
//_OnDeviceLost();
}
m_bDeviceLost = false;
}
this->m_iDevice9->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
hr = this->m_iDevice9->BeginScene();
n_assert(SUCCEEDED(hr));
return Super::BeginFrame();
}
//------------------------------------------------------------------------
/// set the current vertex stream source
void RenderDeviceNull::SetStreamSource(IndexT streamIndex, const VertexBuffer* vb, IndexT offsetVertexIndex)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetVertexLayout(const VertexLayout* vl)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetIndexBuffer(const IndexBuffer* ib)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetPrimitiveGroup(const PrimitiveGroup* pg)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::SetGPUProgram(const GPUProgram* program)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::Draw(SizeT startVertice,SizeT endVertice,SizeT startIndice,SizeT endIndice)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::DrawIndexedInstanced(SizeT numInstances)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::EndFrame()
{
HRESULT hr = this->m_iDevice9->EndScene();
n_assert(SUCCEEDED(hr));
for (SizeT i = 0; i < 8; ++i)
{
hr = m_iDevice9->SetTexture(i,NULL);
n_assert(SUCCEEDED(hr))
}
for (DWORD i = D3DVERTEXTEXTURESAMPLER0; i <= D3DVERTEXTEXTURESAMPLER3; ++i)
{
hr = m_iDevice9->SetTexture(i,NULL);
n_assert(SUCCEEDED(hr))
}
Super::EndFrame();
}
//------------------------------------------------------------------------
void RenderDeviceNull::Present(WindHandle hwnd )
{
if (!hwnd)
hwnd = m_hMainWindow;
m_iDevice9->Present(NULL,NULL,(HWND)hwnd,NULL);
}
//------------------------------------------------------------------------
/// set viewport
void RenderDeviceNull::SetViewPort(const int& x,const int& y,const int& width,const int& height,const float& minZ,const float& maxZ)
{
return;
}
//------------------------------------------------------------------------
void RenderDeviceNull::FXSetClipPlane(const int& index,const Math::float4& plane)
{
return;
}
RenderBase::RenderWindow* RenderDeviceNull::CreateRenderWindow( WindHandle hWnd )
{
return new NullWindow( this, (HWND)hWnd );
}
void RenderDeviceNull::DestroyRenderWindow(RenderBase::RenderWindow* rw)
{
delete rw;
}
bool RenderDeviceNull::OnDeviceLost()
{
return true;
}
}
#endif