mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-10-13 12:35:37 +00:00
Fixes. Added vsh output/fsh input hash matching.
This commit is contained in:
@@ -111,17 +111,27 @@ namespace bgfx
|
||||
uint8_t m_bpp;
|
||||
};
|
||||
|
||||
#ifndef DXGI_FORMAT_B4G4R4A4_UNORM
|
||||
// Win8 only BS
|
||||
// https://blogs.msdn.com/b/chuckw/archive/2012/11/14/directx-11-1-and-windows-7.aspx?Redirected=true
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb173059%28v=vs.85%29.aspx
|
||||
# define DXGI_FORMAT_B4G4R4A4_UNORM DXGI_FORMAT(115)
|
||||
#endif // DXGI_FORMAT_B4G4R4A4_UNORM
|
||||
|
||||
static const TextureFormatInfo s_textureFormat[TextureFormat::Count] =
|
||||
{
|
||||
{ DXGI_FORMAT_BC1_UNORM, 1 },
|
||||
{ DXGI_FORMAT_BC2_UNORM, 1 },
|
||||
{ DXGI_FORMAT_BC3_UNORM, 1 },
|
||||
{ DXGI_FORMAT_UNKNOWN, 0 },
|
||||
{ DXGI_FORMAT_R8_UNORM, 1 },
|
||||
{ DXGI_FORMAT_B8G8R8A8_UNORM, 4 },
|
||||
{ DXGI_FORMAT_B8G8R8A8_UNORM, 4 },
|
||||
{ DXGI_FORMAT_R16G16B16A16_FLOAT, 8 },
|
||||
{ DXGI_FORMAT_B5G6R5_UNORM, 2 },
|
||||
{ DXGI_FORMAT_BC1_UNORM, 4 },
|
||||
{ DXGI_FORMAT_BC2_UNORM, 4 },
|
||||
{ DXGI_FORMAT_BC3_UNORM, 4 },
|
||||
{ DXGI_FORMAT_UNKNOWN, 0 },
|
||||
{ DXGI_FORMAT_R8_UNORM, 8 },
|
||||
{ DXGI_FORMAT_B8G8R8A8_UNORM, 32 },
|
||||
{ DXGI_FORMAT_B8G8R8A8_UNORM, 32 },
|
||||
{ DXGI_FORMAT_R16G16B16A16_FLOAT, 64 },
|
||||
{ DXGI_FORMAT_B5G6R5_UNORM, 16 },
|
||||
{ DXGI_FORMAT_B4G4R4A4_UNORM, 16 },
|
||||
{ DXGI_FORMAT_B5G5R5A1_UNORM, 16 },
|
||||
{ DXGI_FORMAT_R10G10B10A2_UNORM, 32 },
|
||||
};
|
||||
|
||||
static const D3D11_INPUT_ELEMENT_DESC s_attrib[Attrib::Count] =
|
||||
@@ -205,6 +215,11 @@ namespace bgfx
|
||||
struct TextureStage
|
||||
{
|
||||
TextureStage()
|
||||
{
|
||||
clear();
|
||||
}
|
||||
|
||||
void clear()
|
||||
{
|
||||
memset(m_srv, 0, sizeof(m_srv) );
|
||||
memset(m_sampler, 0, sizeof(m_sampler) );
|
||||
@@ -214,6 +229,23 @@ namespace bgfx
|
||||
ID3D11SamplerState* m_sampler[BGFX_STATE_TEX_COUNT];
|
||||
};
|
||||
|
||||
static const GUID WKPDID_D3DDebugObjectName = { 0x429b8c22, 0x9188, 0x4b0c, { 0x87, 0x42, 0xac, 0xb0, 0xbf, 0x85, 0xc2, 0x00 } };
|
||||
|
||||
template <typename Ty>
|
||||
static BX_NO_INLINE void setDebugObjectName(Ty* _interface, const char* _format, ...)
|
||||
{
|
||||
#if BGFX_CONFIG_DEBUG_OBJECT_NAME
|
||||
char temp[2048];
|
||||
va_list argList;
|
||||
va_start(argList, _format);
|
||||
int size = uint32_min(sizeof(temp)-1, vsnprintf(temp, sizeof(temp), _format, argList) );
|
||||
va_end(argList);
|
||||
temp[size] = '\0';
|
||||
|
||||
_interface->SetPrivateData(WKPDID_D3DDebugObjectName, size, temp);
|
||||
#endif // BGFX_CONFIG_DEBUG_OBJECT_NAME
|
||||
}
|
||||
|
||||
struct RendererContext
|
||||
{
|
||||
RendererContext()
|
||||
@@ -372,6 +404,9 @@ namespace bgfx
|
||||
DX_RELEASE(depthStencil, 0);
|
||||
|
||||
m_deviceCtx->OMSetRenderTargets(1, &m_backBufferColor, m_backBufferDepthStencil);
|
||||
|
||||
m_currentColor = m_backBufferColor;
|
||||
m_currentDepthStencil = m_backBufferDepthStencil;
|
||||
}
|
||||
|
||||
void flip()
|
||||
@@ -460,37 +495,40 @@ namespace bgfx
|
||||
if (_rt.idx == invalidHandle)
|
||||
{
|
||||
m_deviceCtx->OMSetRenderTargets(1, &m_backBufferColor, m_backBufferDepthStencil);
|
||||
|
||||
m_currentColor = m_backBufferColor;
|
||||
m_currentDepthStencil = m_backBufferDepthStencil;
|
||||
}
|
||||
else
|
||||
{
|
||||
invalidateTextureStage();
|
||||
|
||||
RenderTarget& renderTarget = m_renderTargets[_rt.idx];
|
||||
m_deviceCtx->OMSetRenderTargets(1, &renderTarget.m_rtv, m_backBufferDepthStencil);
|
||||
m_deviceCtx->OMSetRenderTargets(1, &renderTarget.m_rtv, renderTarget.m_dsv);
|
||||
|
||||
m_currentColor = renderTarget.m_rtv;
|
||||
m_currentDepthStencil = renderTarget.m_dsv;
|
||||
}
|
||||
}
|
||||
|
||||
void clear(const Clear& _clear)
|
||||
{
|
||||
// DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE) );
|
||||
// DX_CHECK(s_renderCtx.m_device->SetScissorRect(&rc) );
|
||||
|
||||
if (BGFX_CLEAR_COLOR_BIT & _clear.m_flags)
|
||||
if (NULL != m_currentColor
|
||||
&& BGFX_CLEAR_COLOR_BIT & _clear.m_flags)
|
||||
{
|
||||
uint32_t rgba = _clear.m_rgba;
|
||||
float frgba[4] = { (rgba>>24)/255.0f, ( (rgba>>16)&0xff)/255.0f, ( (rgba>>8)&0xff)/255.0f, (rgba&0xff)/255.0f };
|
||||
// DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_ALPHA) );
|
||||
m_deviceCtx->ClearRenderTargetView(m_backBufferColor, frgba);
|
||||
m_deviceCtx->ClearRenderTargetView(m_currentColor, frgba);
|
||||
}
|
||||
|
||||
if ( (BGFX_CLEAR_DEPTH_BIT|BGFX_CLEAR_STENCIL_BIT) & _clear.m_flags)
|
||||
if (NULL != m_currentDepthStencil
|
||||
&& (BGFX_CLEAR_DEPTH_BIT|BGFX_CLEAR_STENCIL_BIT) & _clear.m_flags)
|
||||
{
|
||||
DWORD flags = 0;
|
||||
flags |= (_clear.m_flags & BGFX_CLEAR_DEPTH_BIT) ? D3D11_CLEAR_DEPTH : 0;
|
||||
flags |= (_clear.m_flags & BGFX_CLEAR_STENCIL_BIT) ? D3D11_CLEAR_STENCIL : 0;
|
||||
// DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE) );
|
||||
m_deviceCtx->ClearDepthStencilView(m_backBufferDepthStencil, flags, _clear.m_depth, _clear.m_stencil);
|
||||
m_deviceCtx->ClearDepthStencilView(m_currentDepthStencil, flags, _clear.m_depth, _clear.m_stencil);
|
||||
}
|
||||
|
||||
// DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE) );
|
||||
}
|
||||
|
||||
void setInputLayout(const VertexDecl& _vertexDecl, const Program& _program, uint8_t _numInstanceData)
|
||||
@@ -513,7 +551,6 @@ namespace bgfx
|
||||
decl.m_attributes[ii] = attr == 0 ? 0xff : attr == 0xff ? 0 : attr;
|
||||
}
|
||||
|
||||
|
||||
D3D11_INPUT_ELEMENT_DESC* elem = fillVertexDecl(vertexElements, Attrib::Count, decl);
|
||||
ptrdiff_t num = elem-vertexElements;
|
||||
|
||||
@@ -638,7 +675,7 @@ namespace bgfx
|
||||
|
||||
DX_CHECK(m_device->CreateDepthStencilState(&desc, &dss) );
|
||||
|
||||
m_depthStencilStateCache.add(_state, dss);
|
||||
m_depthStencilStateCache.add(hash, dss);
|
||||
}
|
||||
|
||||
m_deviceCtx->OMSetDepthStencilState(dss, ref);
|
||||
@@ -661,12 +698,19 @@ namespace bgfx
|
||||
ID3D11RasterizerState* rs = m_rasterizerStateCache.find(_state);
|
||||
if (NULL == rs)
|
||||
{
|
||||
D3D11_RASTERIZER_DESC desc;
|
||||
memset(&desc, 0, sizeof(desc) );
|
||||
desc.FillMode = _wireframe ? D3D11_FILL_WIREFRAME : D3D11_FILL_SOLID;
|
||||
|
||||
uint32_t cull = (_state&BGFX_STATE_CULL_MASK)>>BGFX_STATE_CULL_SHIFT;
|
||||
|
||||
D3D11_RASTERIZER_DESC desc;
|
||||
desc.FillMode = _wireframe ? D3D11_FILL_WIREFRAME : D3D11_FILL_SOLID;
|
||||
desc.CullMode = s_cullMode[cull];
|
||||
desc.FrontCounterClockwise = false;
|
||||
desc.DepthBias = 0;
|
||||
desc.DepthBiasClamp = 0.0f;
|
||||
desc.SlopeScaledDepthBias = 0.0f;
|
||||
desc.DepthClipEnable = false;
|
||||
desc.ScissorEnable = false;
|
||||
desc.MultisampleEnable = false;
|
||||
desc.AntialiasedLineEnable = false;
|
||||
|
||||
DX_CHECK(m_device->CreateRasterizerState(&desc, &rs) );
|
||||
|
||||
@@ -682,6 +726,12 @@ namespace bgfx
|
||||
m_deviceCtx->PSSetSamplers(0, BGFX_STATE_TEX_COUNT, m_textureStage.m_sampler);
|
||||
}
|
||||
|
||||
void invalidateTextureStage()
|
||||
{
|
||||
m_textureStage.clear();
|
||||
commitTextureStage();
|
||||
}
|
||||
|
||||
void saveScreenShot(Memory* _mem)
|
||||
{
|
||||
ID3D11Texture2D* backBuffer;
|
||||
@@ -704,7 +754,7 @@ namespace bgfx
|
||||
{
|
||||
if (backBufferDesc.SampleDesc.Count == 1)
|
||||
{
|
||||
m_deviceCtx->CopyResource(texture, backBuffer);
|
||||
m_deviceCtx->CopyResource(texture, backBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -715,8 +765,8 @@ namespace bgfx
|
||||
if (SUCCEEDED(hr) )
|
||||
{
|
||||
m_deviceCtx->ResolveSubresource(resolve, 0, backBuffer, 0, desc.Format);
|
||||
m_deviceCtx->CopyResource(texture, resolve);
|
||||
DX_RELEASE(resolve, 0);
|
||||
m_deviceCtx->CopyResource(texture, resolve);
|
||||
DX_RELEASE(resolve, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -737,6 +787,8 @@ namespace bgfx
|
||||
ID3D11DeviceContext* m_deviceCtx;
|
||||
ID3D11RenderTargetView* m_backBufferColor;
|
||||
ID3D11DepthStencilView* m_backBufferDepthStencil;
|
||||
ID3D11RenderTargetView* m_currentColor;
|
||||
ID3D11DepthStencilView* m_currentDepthStencil;
|
||||
|
||||
bool m_wireframe;
|
||||
|
||||
@@ -1059,25 +1111,28 @@ namespace bgfx
|
||||
uint32_t m_abgr;
|
||||
} * vertex = (Vertex*)m_vb->data;
|
||||
|
||||
const uint32_t abgr = bx::endianSwap(_clear.m_rgba);
|
||||
const float depth = _clear.m_depth;
|
||||
|
||||
vertex->m_x = -1.0f;
|
||||
vertex->m_y = -1.0f;
|
||||
vertex->m_z = _clear.m_depth;
|
||||
vertex->m_abgr = bx::endianSwap(_clear.m_rgba);
|
||||
vertex->m_z = depth;
|
||||
vertex->m_abgr = abgr;
|
||||
vertex++;
|
||||
vertex->m_x = 1.0f;
|
||||
vertex->m_y = -1.0f;
|
||||
vertex->m_z = _clear.m_depth;
|
||||
vertex->m_abgr = bx::endianSwap(_clear.m_rgba);
|
||||
vertex->m_z = depth;
|
||||
vertex->m_abgr = abgr;
|
||||
vertex++;
|
||||
vertex->m_x = 1.0f;
|
||||
vertex->m_y = 1.0f;
|
||||
vertex->m_z = _clear.m_depth;
|
||||
vertex->m_abgr = bx::endianSwap(_clear.m_rgba);
|
||||
vertex->m_z = depth;
|
||||
vertex->m_abgr = abgr;
|
||||
vertex++;
|
||||
vertex->m_x = -1.0f;
|
||||
vertex->m_y = 1.0f;
|
||||
vertex->m_z = _clear.m_depth;
|
||||
vertex->m_abgr = bx::endianSwap(_clear.m_rgba);
|
||||
vertex->m_z = depth;
|
||||
vertex->m_abgr = abgr;
|
||||
}
|
||||
|
||||
s_renderCtx.m_vertexBuffers[m_vb->handle.idx].update(0, 4*m_decl.m_stride, m_vb->data);
|
||||
@@ -1094,17 +1149,21 @@ namespace bgfx
|
||||
|
||||
void Shader::create(bool _fragment, const Memory* _mem)
|
||||
{
|
||||
m_constantBuffer = ConstantBuffer::create(1024);
|
||||
bx::MemoryReader reader(_mem->data, _mem->size);
|
||||
|
||||
StreamRead stream(_mem->data, _mem->size);
|
||||
uint32_t magic;
|
||||
bx::read(&reader, magic);
|
||||
|
||||
stream.read(m_attrMask, sizeof(m_attrMask) );
|
||||
uint32_t iohash;
|
||||
bx::read(&reader, iohash);
|
||||
|
||||
bx::read(&reader, m_attrMask, sizeof(m_attrMask) );
|
||||
|
||||
uint16_t count;
|
||||
stream.read(count);
|
||||
bx::read(&reader, count);
|
||||
|
||||
uint16_t size;
|
||||
stream.read(size);
|
||||
bx::read(&reader, size);
|
||||
|
||||
if (0 < size)
|
||||
{
|
||||
@@ -1125,70 +1184,75 @@ namespace bgfx
|
||||
|
||||
uint8_t fragmentBit = _fragment ? BGFX_UNIFORM_FRAGMENTBIT : 0;
|
||||
|
||||
for (uint32_t ii = 0; ii < count; ++ii)
|
||||
if (0 < count)
|
||||
{
|
||||
uint8_t nameSize;
|
||||
stream.read(nameSize);
|
||||
m_constantBuffer = ConstantBuffer::create(1024);
|
||||
|
||||
char name[256];
|
||||
stream.read(&name, nameSize);
|
||||
name[nameSize] = '\0';
|
||||
|
||||
uint8_t type;
|
||||
stream.read(type);
|
||||
|
||||
uint8_t num;
|
||||
stream.read(num);
|
||||
|
||||
uint16_t regIndex;
|
||||
stream.read(regIndex);
|
||||
|
||||
uint16_t regCount;
|
||||
stream.read(regCount);
|
||||
|
||||
const char* kind = "invalid";
|
||||
|
||||
const void* data = NULL;
|
||||
PredefinedUniform::Enum predefined = nameToPredefinedUniformEnum(name);
|
||||
if (PredefinedUniform::Count != predefined)
|
||||
for (uint32_t ii = 0; ii < count; ++ii)
|
||||
{
|
||||
kind = "predefined";
|
||||
m_predefined[m_numPredefined].m_loc = regIndex;
|
||||
m_predefined[m_numPredefined].m_count = regCount;
|
||||
m_predefined[m_numPredefined].m_type = predefined|fragmentBit;
|
||||
m_numPredefined++;
|
||||
}
|
||||
else
|
||||
{
|
||||
const UniformInfo* info = s_renderCtx.m_uniformReg.find(name);
|
||||
UniformBuffer* uniform = info != NULL ? (UniformBuffer*)info->m_data : NULL;
|
||||
uint8_t nameSize;
|
||||
bx::read(&reader, nameSize);
|
||||
|
||||
if (NULL != uniform)
|
||||
char name[256];
|
||||
bx::read(&reader, &name, nameSize);
|
||||
name[nameSize] = '\0';
|
||||
|
||||
uint8_t type;
|
||||
bx::read(&reader, type);
|
||||
|
||||
uint8_t num;
|
||||
bx::read(&reader, num);
|
||||
|
||||
uint16_t regIndex;
|
||||
bx::read(&reader, regIndex);
|
||||
|
||||
uint16_t regCount;
|
||||
bx::read(&reader, regCount);
|
||||
|
||||
const char* kind = "invalid";
|
||||
|
||||
const void* data = NULL;
|
||||
PredefinedUniform::Enum predefined = nameToPredefinedUniformEnum(name);
|
||||
if (PredefinedUniform::Count != predefined)
|
||||
{
|
||||
kind = "user";
|
||||
data = uniform->m_data;
|
||||
m_constantBuffer->writeUniformRef( (UniformType::Enum)(type|fragmentBit), regIndex, data, regCount);
|
||||
kind = "predefined";
|
||||
m_predefined[m_numPredefined].m_loc = regIndex;
|
||||
m_predefined[m_numPredefined].m_count = regCount;
|
||||
m_predefined[m_numPredefined].m_type = predefined|fragmentBit;
|
||||
m_numPredefined++;
|
||||
}
|
||||
else
|
||||
{
|
||||
const UniformInfo* info = s_renderCtx.m_uniformReg.find(name);
|
||||
UniformBuffer* uniform = info != NULL ? (UniformBuffer*)info->m_data : NULL;
|
||||
|
||||
if (NULL != uniform)
|
||||
{
|
||||
kind = "user";
|
||||
data = uniform->m_data;
|
||||
m_constantBuffer->writeUniformRef( (UniformType::Enum)(type|fragmentBit), regIndex, data, regCount);
|
||||
}
|
||||
}
|
||||
|
||||
BX_TRACE("\t%s: %s, type %2d, num %2d, r.index %3d, r.count %2d"
|
||||
, kind
|
||||
, name
|
||||
, type
|
||||
, num
|
||||
, regIndex
|
||||
, regCount
|
||||
);
|
||||
BX_UNUSED(kind);
|
||||
}
|
||||
|
||||
BX_TRACE("\t%s: %s, type %2d, num %2d, r.index %3d, r.count %2d"
|
||||
, kind
|
||||
, name
|
||||
, type
|
||||
, num
|
||||
, regIndex
|
||||
, regCount
|
||||
);
|
||||
BX_UNUSED(kind);
|
||||
m_constantBuffer->finish();
|
||||
}
|
||||
|
||||
uint16_t shaderSize;
|
||||
stream.read(shaderSize);
|
||||
bx::read(&reader, shaderSize);
|
||||
|
||||
m_constantBuffer->finish();
|
||||
|
||||
const DWORD* code = (const DWORD*)stream.getDataPtr();
|
||||
stream.skip(shaderSize);
|
||||
const DWORD* code = (const DWORD*)reader.getDataPtr();
|
||||
bx::skip(&reader, shaderSize);
|
||||
|
||||
if (_fragment)
|
||||
{
|
||||
@@ -1196,7 +1260,7 @@ namespace bgfx
|
||||
}
|
||||
else
|
||||
{
|
||||
m_hash = hash(code, shaderSize);
|
||||
m_hash = hashMurmur2A(code, shaderSize);
|
||||
m_code = alloc(shaderSize);
|
||||
memcpy(m_code->data, code, shaderSize);
|
||||
|
||||
@@ -1234,8 +1298,6 @@ namespace bgfx
|
||||
|
||||
if (parseDds(dds, _mem) )
|
||||
{
|
||||
uint8_t bpp = dds.m_bpp;
|
||||
|
||||
bool decompress = false;
|
||||
|
||||
if (dds.m_cubeMap)
|
||||
@@ -1281,16 +1343,16 @@ namespace bgfx
|
||||
{
|
||||
if (convert)
|
||||
{
|
||||
uint8_t* temp = (uint8_t*)g_realloc(NULL, mip.m_width*bpp*mip.m_height);
|
||||
uint8_t* temp = (uint8_t*)g_realloc(NULL, mip.m_width*bpp*mip.m_height/8);
|
||||
mip.decode(temp);
|
||||
|
||||
srd[kk].pSysMem = temp;
|
||||
srd[kk].SysMemPitch = mip.m_width*bpp;
|
||||
srd[kk].SysMemPitch = mip.m_width*bpp/8;
|
||||
}
|
||||
else
|
||||
{
|
||||
srd[kk].pSysMem = mip.m_data;
|
||||
srd[kk].SysMemPitch = mip.m_width*mip.m_bpp;
|
||||
srd[kk].SysMemPitch = mip.m_width*mip.m_bpp/8;
|
||||
}
|
||||
|
||||
srd[kk].SysMemSlicePitch = mip.m_height*srd[kk].SysMemPitch;
|
||||
@@ -1320,7 +1382,7 @@ namespace bgfx
|
||||
}
|
||||
else
|
||||
{
|
||||
srd[kk].SysMemPitch = mip.m_width*mip.m_bpp;
|
||||
srd[kk].SysMemPitch = mip.m_width*mip.m_bpp/8;
|
||||
srd[kk].SysMemSlicePitch = mip.m_height*srd[kk].SysMemPitch;
|
||||
}
|
||||
|
||||
@@ -1407,22 +1469,22 @@ namespace bgfx
|
||||
}
|
||||
else
|
||||
{
|
||||
StreamRead stream(_mem->data, _mem->size);
|
||||
bx::MemoryReader reader(_mem->data, _mem->size);
|
||||
|
||||
uint32_t magic;
|
||||
stream.read(magic);
|
||||
bx::read(&reader, magic);
|
||||
|
||||
if (BGFX_MAGIC == magic)
|
||||
if (BGFX_CHUNK_MAGIC_TEX == magic)
|
||||
{
|
||||
TextureCreate tc;
|
||||
stream.read(tc);
|
||||
bx::read(&reader, tc);
|
||||
|
||||
D3D11_TEXTURE2D_DESC desc;
|
||||
desc.Width = tc.m_width;
|
||||
desc.Height = tc.m_height;
|
||||
desc.MipLevels = tc.m_numMips;
|
||||
desc.ArraySize = 1;
|
||||
desc.Format = s_textureFormat[tc.m_type].m_fmt;
|
||||
desc.Format = s_textureFormat[tc.m_format].m_fmt;
|
||||
desc.SampleDesc.Count = 1;
|
||||
desc.SampleDesc.Quality = 0;
|
||||
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
|
||||
@@ -1436,14 +1498,14 @@ namespace bgfx
|
||||
desc.Usage = D3D11_USAGE_IMMUTABLE;
|
||||
|
||||
D3D11_SUBRESOURCE_DATA* srd = (D3D11_SUBRESOURCE_DATA*)alloca(tc.m_numMips*sizeof(D3D11_SUBRESOURCE_DATA) );
|
||||
uint32_t bpp = s_textureFormat[tc.m_type].m_bpp;
|
||||
uint32_t bpp = s_textureFormat[tc.m_format].m_bpp;
|
||||
uint8_t* data = tc.m_mem->data;
|
||||
|
||||
for (uint8_t side = 0, numSides = tc.m_cubeMap ? 6 : 1; side < numSides; ++side)
|
||||
{
|
||||
uint32_t width = tc.m_width;
|
||||
uint32_t height = tc.m_height;
|
||||
uint32_t depth = tc.m_depth;
|
||||
uint32_t depth = tc.m_depth;
|
||||
|
||||
for (uint32_t lod = 0, num = tc.m_numMips; lod < num; ++lod)
|
||||
{
|
||||
@@ -1452,14 +1514,14 @@ namespace bgfx
|
||||
depth = uint32_max(1, depth);
|
||||
|
||||
srd[lod].pSysMem = data;
|
||||
srd[lod].SysMemPitch = width*bpp;
|
||||
srd[lod].SysMemPitch = width*bpp/8;
|
||||
srd[lod].SysMemSlicePitch = 0;
|
||||
|
||||
data += width*height*bpp;
|
||||
data += width*height*bpp/8;
|
||||
|
||||
width >>= 1;
|
||||
height >>= 1;
|
||||
depth >>= 1;
|
||||
depth >>= 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1493,16 +1555,16 @@ namespace bgfx
|
||||
s_renderCtx.m_textureStage.m_sampler[_stage] = m_sampler;
|
||||
}
|
||||
|
||||
void Texture::update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, const Memory* _mem)
|
||||
{
|
||||
void Texture::update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, const Memory* _mem)
|
||||
{
|
||||
ID3D11DeviceContext* deviceCtx = s_renderCtx.m_deviceCtx;
|
||||
|
||||
D3D11_BOX box;
|
||||
box.left = _rect.m_x;
|
||||
box.top = _rect.m_y;
|
||||
box.right = box.left + _rect.m_width;
|
||||
D3D11_BOX box;
|
||||
box.left = _rect.m_x;
|
||||
box.top = _rect.m_y;
|
||||
box.right = box.left + _rect.m_width;
|
||||
box.bottom = box.top + _rect.m_height;
|
||||
box.front = _z;
|
||||
box.front = _z;
|
||||
box.back = box.front + _depth;
|
||||
|
||||
uint32_t subres = _mip + (_side * m_numMips);
|
||||
@@ -1523,7 +1585,7 @@ namespace bgfx
|
||||
#else
|
||||
deviceCtx->UpdateSubresource(m_ptr, subres, &box, _mem->data, _rect.m_width, 0);
|
||||
#endif // 0
|
||||
}
|
||||
}
|
||||
|
||||
void RenderTarget::create(uint16_t _width, uint16_t _height, uint32_t _flags, uint32_t _textureFlags)
|
||||
{
|
||||
@@ -1532,6 +1594,7 @@ namespace bgfx
|
||||
m_flags = _flags;
|
||||
|
||||
uint32_t colorFormat = (m_flags&BGFX_RENDER_TARGET_COLOR_MASK)>>BGFX_RENDER_TARGET_COLOR_SHIFT;
|
||||
uint32_t depthFormat = (m_flags&BGFX_RENDER_TARGET_DEPTH_MASK)>>BGFX_RENDER_TARGET_DEPTH_SHIFT;
|
||||
|
||||
D3D11_TEXTURE2D_DESC desc;
|
||||
desc.Width = _width;
|
||||
@@ -1550,6 +1613,26 @@ namespace bgfx
|
||||
DX_CHECK(s_renderCtx.m_device->CreateRenderTargetView(m_colorTexture, NULL, &m_rtv) );
|
||||
DX_CHECK(s_renderCtx.m_device->CreateShaderResourceView(m_colorTexture, NULL, &m_srv) );
|
||||
|
||||
if (0 < depthFormat)
|
||||
{
|
||||
D3D11_TEXTURE2D_DESC desc;
|
||||
desc.Width = _width;
|
||||
desc.Height = _height;
|
||||
desc.MipLevels = 1;
|
||||
desc.ArraySize = 1;
|
||||
desc.Format = s_depthFormat[colorFormat];
|
||||
desc.SampleDesc.Count = 1;
|
||||
desc.SampleDesc.Quality = 0;
|
||||
desc.Usage = D3D11_USAGE_DEFAULT;
|
||||
desc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
|
||||
desc.CPUAccessFlags = 0;
|
||||
desc.MiscFlags = 0;
|
||||
|
||||
DX_CHECK(s_renderCtx.m_device->CreateTexture2D(&desc, NULL, &m_depthTexture) );
|
||||
DX_CHECK(s_renderCtx.m_device->CreateDepthStencilView(m_depthTexture, NULL, &m_dsv) );
|
||||
// DX_CHECK(s_renderCtx.m_device->CreateShaderResourceView(m_depthTexture, NULL, &m_srv) );
|
||||
}
|
||||
|
||||
m_sampler = s_renderCtx.m_samplerStateCache.find(_flags);
|
||||
if (NULL == m_sampler)
|
||||
{
|
||||
@@ -1578,6 +1661,8 @@ namespace bgfx
|
||||
DX_RELEASE(m_srv, 0);
|
||||
DX_RELEASE(m_rtv, 0);
|
||||
DX_RELEASE(m_colorTexture, 0);
|
||||
DX_RELEASE(m_dsv, 0);
|
||||
DX_RELEASE(m_depthTexture, 0);
|
||||
|
||||
m_flags = 0;
|
||||
}
|
||||
@@ -1889,8 +1974,7 @@ namespace bgfx
|
||||
s_renderCtx.setDepthStencilState(newFlags, newStencil);
|
||||
}
|
||||
|
||||
if ( (BGFX_STATE_CULL_MASK
|
||||
|BGFX_STATE_ALPHA_MASK|BGFX_STATE_ALPHA_WRITE|BGFX_STATE_RGB_WRITE
|
||||
if ( (BGFX_STATE_CULL_MASK|BGFX_STATE_ALPHA_MASK|BGFX_STATE_RGB_WRITE
|
||||
|BGFX_STATE_BLEND_MASK|BGFX_STATE_ALPHA_REF_MASK|BGFX_STATE_PT_MASK
|
||||
|BGFX_STATE_POINT_SIZE_MASK|BGFX_STATE_SRGBWRITE|BGFX_STATE_MSAA) & changedFlags)
|
||||
{
|
||||
@@ -1904,6 +1988,12 @@ namespace bgfx
|
||||
s_renderCtx.setRasterizerState(newFlags, wireframe);
|
||||
}
|
||||
|
||||
if ( (BGFX_STATE_ALPHA_TEST|BGFX_STATE_ALPHA_REF_MASK) & changedFlags)
|
||||
{
|
||||
uint32_t ref = (newFlags&BGFX_STATE_ALPHA_REF_MASK)>>BGFX_STATE_ALPHA_REF_SHIFT;
|
||||
alphaRef = ref/255.0f;
|
||||
}
|
||||
|
||||
uint8_t primIndex = uint8_t( (newFlags&BGFX_STATE_PT_MASK)>>BGFX_STATE_PT_SHIFT);
|
||||
if (primType != s_primType[primIndex])
|
||||
{
|
||||
@@ -1950,8 +2040,7 @@ namespace bgfx
|
||||
|
||||
if (constantsChanged)
|
||||
{
|
||||
program.m_vsh->m_constantBuffer->commit();
|
||||
program.m_fsh->m_constantBuffer->commit();
|
||||
program.commit();
|
||||
}
|
||||
|
||||
for (uint32_t ii = 0, num = program.m_numPredefined; ii < num; ++ii)
|
||||
|
||||
Reference in New Issue
Block a user