Files
cool-source-archive/materialsystem/shaderapidx11/ShaderConstantBufferDx11.cpp
Totterynine 2773eae4d7 shaderapidx11
use -dxlevel 110 to use it
2021-09-22 18:56:56 +05:00

106 lines
2.8 KiB
C++

// HUH???
#define RAD_TELEMETRY_DISABLED
#include "ShaderConstantBufferDx11.h"
#include "Dx11Global.h"
#include "FastMemcpy.h"
// NOTE: This has to be the last file included!
#include "tier0/memdbgon.h"
static FORCEINLINE void *memcpy_SSE_V2( void *pdst, const void *psrc, size_t size )
{
const char *dst = (const char *)pdst;
const char *src = (const char *)psrc;
_mm_prefetch( src, _MM_HINT_NTA );
for ( ; size >= 16; size -= 16 )
{
__m128i w0, w1, w2, w3, w4, w5, w6, w7;
w0 = _mm_load_si128( ( ( const __m128i * )src ) + 0 );
w1 = _mm_load_si128( ( ( const __m128i * )src ) + 1 );
w2 = _mm_load_si128( ( ( const __m128i * )src ) + 2 );
w3 = _mm_load_si128( ( ( const __m128i * )src ) + 3 );
w4 = _mm_load_si128( ( ( const __m128i * )src ) + 4 );
w5 = _mm_load_si128( ( ( const __m128i * )src ) + 5 );
w6 = _mm_load_si128( ( ( const __m128i * )src ) + 6 );
w7 = _mm_load_si128( ( ( const __m128i * )src ) + 7 );
_mm_prefetch( ( src + 128 ), _MM_HINT_NTA );
src += 16;
_mm_stream_si128( ( ( ( __m128i * )dst ) + 0 ), w0 );
_mm_stream_si128( ( ( ( __m128i * )dst ) + 1 ), w1 );
_mm_stream_si128( ( ( ( __m128i * )dst ) + 2 ), w2 );
_mm_stream_si128( ( ( ( __m128i * )dst ) + 3 ), w3 );
_mm_stream_si128( ( ( ( __m128i * )dst ) + 4 ), w4 );
_mm_stream_si128( ( ( ( __m128i * )dst ) + 5 ), w5 );
_mm_stream_si128( ( ( ( __m128i * )dst ) + 6 ), w6 );
_mm_stream_si128( ( ( ( __m128i * )dst ) + 7 ), w7 );
dst += 16;
}
return pdst;
}
CShaderConstantBufferDx11::CShaderConstantBufferDx11() :
m_pCBuffer( NULL ),
m_nBufSize( 0 ),
m_bNeedsUpdate( false ),
m_bDynamic( false ),
m_pData( NULL ),
m_bLocked( false )
{
}
void CShaderConstantBufferDx11::Create( size_t nBufferSize, bool bDynamic )
{
m_nBufSize = nBufferSize;
m_bDynamic = bDynamic;
//Log( "Creating constant buffer of size %u\n", nBufferSize );
D3D11_BUFFER_DESC cbDesc;
cbDesc.ByteWidth = m_nBufSize;
cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
cbDesc.MiscFlags = 0;
cbDesc.StructureByteStride = 0;
if ( bDynamic )
{
cbDesc.Usage = D3D11_USAGE_DYNAMIC;
cbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
}
else
{
cbDesc.Usage = D3D11_USAGE_DEFAULT;
cbDesc.CPUAccessFlags = 0;
}
// Fill the buffer with all zeros
m_pData = _aligned_malloc( nBufferSize, 16 );
ZeroMemory( m_pData, nBufferSize );
D3D11_SUBRESOURCE_DATA initialData;
initialData.pSysMem = m_pData;
initialData.SysMemPitch = 0;
initialData.SysMemSlicePitch = 0;
//Log( "Creating D3D constant buffer: size: %i\n", m_nBufSize );
HRESULT hr = D3D11Device()->CreateBuffer( &cbDesc, &initialData, &m_pCBuffer );
if ( FAILED( hr ) )
{
Warning( "Could not set constant buffer!" );
//return NULL;
}
}
void CShaderConstantBufferDx11::Destroy()
{
if ( m_pCBuffer )
m_pCBuffer->Release();
m_pCBuffer = NULL;
if ( m_pData )
_aligned_free( m_pData );
m_pData = NULL;
}