mirror of
https://github.com/celisej567/cool-source-archive.git
synced 2026-09-15 20:09:19 +03:00
106 lines
2.8 KiB
C++
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;
|
|
} |