void MFMat_Standard_CreateInstancePlatformSpecific(MFMaterial *pMaterial) { MFMat_Standard_Data_D3D11 *pData = (MFMat_Standard_Data_D3D11*)pMaterial->pInstanceData; MFMatrix mat = pData->textureMatrix; mat.Transpose(); pData->cbMaterial.mTexMatrix[0] = mat.GetXAxis(); pData->cbMaterial.mTexMatrix[1] = mat.GetYAxis(); pData->cbMaterial.vMeshColour = MFVector::white; pData->cbMaterial.gModelColour = MFVector::white; pData->cbMaterial.gColourMask = MakeVector(1.0f, 0.0f, 1.0f, 0.0f); D3D11_BUFFER_DESC desc; MFZeroMemory(&desc, sizeof(desc)); desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; desc.ByteWidth = sizeof(pData->cbMaterial); desc.Usage = D3D11_USAGE_DEFAULT; //desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; g_pd3dDevice->CreateBuffer(&desc, NULL, &pData->pConstantBuffer); MFRenderer_D3D11_SetDebugName(pData->pConstantBuffer, pMaterial->pName); }
// interface functions void MFTexture_CreatePlatformSpecific(MFTexture *pTexture, bool generateMipChain) { MFCALLSTACK; HRESULT hr; MFTextureTemplateData *pTemplate = pTexture->pTemplateData; pTexture->pInternalData = NULL; // create texture DXGI_FORMAT platformFormat = (DXGI_FORMAT)MFTexture_GetPlatformFormatID(pTemplate->imageFormat, MFDD_D3D11); //hr = D3DX11CreateTextureFromMemory(pd3dDevice, pTemplate->pSurfaces[0].width, pTemplate->pSurfaces[0].height, generateMipChain ? 0 : 1, 0, platformFormat, D3DPOOL_MANAGED, (IDirect3DTexture9**)&pTexture->pInternalData); int pitch = (MFTexture_GetBitsPerPixel(pTemplate->imageFormat) / 8) * pTemplate->pSurfaces[0].width; D3D11_TEXTURE2D_DESC desc; MFZeroMemory(&desc, sizeof(desc)); desc.Width = pTemplate->pSurfaces[0].width; desc.Height = pTemplate->pSurfaces[0].height; desc.MipLevels = 1; //generateMipChain ? 0 : 1; desc.ArraySize = 1; desc.Format = platformFormat; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Usage = D3D11_USAGE_DEFAULT; // = D3D11_USAGE_IMMUTABLE; desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; desc.CPUAccessFlags = 0; desc.MiscFlags = generateMipChain ? D3D11_RESOURCE_MISC_GENERATE_MIPS : 0; D3D11_SUBRESOURCE_DATA data[16]; MFZeroMemory(&data, sizeof(data)); data[0].pSysMem = pTemplate->pSurfaces[0].pImageData; data[0].SysMemPitch = pitch; ID3D11Texture2D* pTex = NULL; hr = g_pd3dDevice->CreateTexture2D(&desc, data, &pTex); //MFDebug_Assert(hr != D3DERR_NOTAVAILABLE, MFStr("LoadTexture failed: D3DERR_NOTAVAILABLE, 0x%08X", hr)); //MFDebug_Assert(hr != D3DERR_OUTOFVIDEOMEMORY, MFStr("LoadTexture failed: D3DERR_OUTOFVIDEOMEMORY, 0x%08X", hr)); //MFDebug_Assert(hr != D3DERR_INVALIDCALL, MFStr("LoadTexture failed: D3DERR_INVALIDCALL, 0x%08X", hr)); //MFDebug_Assert(hr != D3DXERR_INVALIDDATA, MFStr("LoadTexture failed: D3DXERR_INVALIDDATA, 0x%08X", hr)); MFDebug_Assert(hr == S_OK, MFStr("Failed to create texture '%s'.", pTexture->name)); if (SUCCEEDED(hr)) { MFRenderer_D3D11_SetDebugName(pTex, pTexture->name); //// filter mip levels if (generateMipChain) D3DX11FilterTexture(NULL, pTex, 0, D3DX11_FILTER_BOX); ID3D11ShaderResourceView *pSRV = NULL; D3D11_SHADER_RESOURCE_VIEW_DESC desc; MFZeroMemory(&desc, sizeof(desc)); desc.Format = platformFormat; desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; desc.Texture2D.MostDetailedMip = 0; desc.Texture2D.MipLevels = (uint32)-1; hr = g_pd3dDevice->CreateShaderResourceView(pTex, &desc, &pSRV); pTex->Release(); pTexture->pInternalData = pSRV; } }
int MFRenderer_CreateDisplay(MFDisplay *pDisplay) { HWND hWnd = (HWND)MFWindow_GetSystemWindowHandle(pDisplay->settings.pWindow); HRESULT hr = S_OK; RECT rc; GetClientRect( hWnd, &rc ); UINT width = rc.right - rc.left; UINT height = rc.bottom - rc.top; UINT createDeviceFlags = 0; #ifdef _DEBUG createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; #endif D3D_DRIVER_TYPE driverTypes[] = { D3D_DRIVER_TYPE_HARDWARE, D3D_DRIVER_TYPE_WARP, D3D_DRIVER_TYPE_REFERENCE, }; UINT numDriverTypes = ARRAYSIZE( driverTypes ); D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_3, D3D_FEATURE_LEVEL_9_2, D3D_FEATURE_LEVEL_9_1, }; UINT numFeatureLevels = ARRAYSIZE( featureLevels ); DXGI_SWAP_CHAIN_DESC sd; MFZeroMemory( &sd, sizeof( sd ) ); sd.BufferCount = 1; sd.BufferDesc.Width = width; sd.BufferDesc.Height = height; sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; sd.BufferDesc.RefreshRate.Numerator = 60; sd.BufferDesc.RefreshRate.Denominator = 1; sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; sd.OutputWindow = hWnd; sd.SampleDesc.Count = 1; sd.SampleDesc.Quality = 0; sd.Windowed = TRUE; for( UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++ ) { g_driverType = driverTypes[driverTypeIndex]; hr = D3D11CreateDeviceAndSwapChain( NULL, g_driverType, NULL, createDeviceFlags, featureLevels, numFeatureLevels, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &g_featureLevel, &g_pImmediateContext ); if( SUCCEEDED( hr ) ) break; } if( FAILED( hr ) ) return hr; MFRenderer_D3D11_SetDebugName(g_pImmediateContext, "MFRenderer global device context"); // Create a render target view ID3D11Texture2D* pBackBuffer = NULL; hr = g_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&pBackBuffer ); if( FAILED( hr ) ) return hr; MFRenderer_D3D11_SetDebugName(pBackBuffer, "MFRenderer back buffer"); hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, NULL, &g_pRenderTargetView ); pBackBuffer->Release(); if( FAILED( hr ) ) return hr; MFRenderer_D3D11_SetDebugName(g_pRenderTargetView, "MFRenderer render target view"); // Create depth stencil texture D3D11_TEXTURE2D_DESC descDepth; ZeroMemory( &descDepth, sizeof(descDepth) ); descDepth.Width = width; descDepth.Height = height; descDepth.MipLevels = 1; descDepth.ArraySize = 1; descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; descDepth.SampleDesc.Count = 1; descDepth.SampleDesc.Quality = 0; descDepth.Usage = D3D11_USAGE_DEFAULT; descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; descDepth.CPUAccessFlags = 0; descDepth.MiscFlags = 0; hr = g_pd3dDevice->CreateTexture2D( &descDepth, NULL, &g_pDepthStencil ); if( FAILED( hr ) ) return hr; MFRenderer_D3D11_SetDebugName(g_pDepthStencil, "MFRenderer depth stencil buffer"); // Create the depth stencil view D3D11_DEPTH_STENCIL_VIEW_DESC descDSV; ZeroMemory( &descDSV, sizeof(descDSV) ); descDSV.Format = descDepth.Format; descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; descDSV.Texture2D.MipSlice = 0; hr = g_pd3dDevice->CreateDepthStencilView( g_pDepthStencil, &descDSV, &g_pDepthStencilView ); if( FAILED( hr ) ) return hr; MFRenderer_D3D11_SetDebugName(g_pDepthStencilView, "MFRenderer depth stencil view"); g_pImmediateContext->OMSetRenderTargets( 1, &g_pRenderTargetView, g_pDepthStencilView ); // Setup the viewport D3D11_VIEWPORT vp; vp.Width = (FLOAT)width; vp.Height = (FLOAT)height; vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; vp.TopLeftX = 0; vp.TopLeftY = 0; g_pImmediateContext->RSSetViewports( 1, &vp ); //-- cbWorld.mWorldToScreen = MFMatrix::identity; cbWorld.mLocalToWorld = MFMatrix::identity; D3D11_BUFFER_DESC desc; MFZeroMemory(&desc, sizeof(desc)); desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; desc.ByteWidth = sizeof(cbWorld); desc.Usage = D3D11_USAGE_DEFAULT; //desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; D3D11_SUBRESOURCE_DATA data; MFZeroMemory(&data, sizeof(data)); data.pSysMem = &cbWorld; g_pd3dDevice->CreateBuffer(&desc, &data, &g_pConstantBufferWorld); MFRenderer_D3D11_SetDebugName(g_pConstantBufferWorld, "MFRenderer world constant buffer"); g_pImmediateContext->VSSetConstantBuffers(n_cbWorld, 1, &g_pConstantBufferWorld); g_pImmediateContext->PSSetConstantBuffers(n_cbWorld, 1, &g_pConstantBufferWorld); return 0; }