Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
D3D11: Add a large amounts of asserts
  • Loading branch information
hrydgard committed Mar 5, 2017
1 parent 480a05d commit 9d11650
Show file tree
Hide file tree
Showing 9 changed files with 45 additions and 52 deletions.
21 changes: 11 additions & 10 deletions GPU/D3D11/D3D11Util.cpp
Expand Up @@ -86,12 +86,12 @@ void StockObjectsD3D11::Create(ID3D11Device *device) {
blend_desc.IndependentBlendEnable = false;
for (int i = 0; i < 16; i++) {
blend_desc.RenderTarget[0].RenderTargetWriteMask = i;
device->CreateBlendState(&blend_desc, &blendStateDisabledWithColorMask[i]);
ASSERT_SUCCESS(device->CreateBlendState(&blend_desc, &blendStateDisabledWithColorMask[i]));
}

D3D11_DEPTH_STENCIL_DESC depth_desc{};
depth_desc.DepthEnable = FALSE;
device->CreateDepthStencilState(&depth_desc, &depthStencilDisabled);
ASSERT_SUCCESS(device->CreateDepthStencilState(&depth_desc, &depthStencilDisabled));
depth_desc.StencilEnable = TRUE;
depth_desc.StencilReadMask = 0xFF;
depth_desc.StencilWriteMask = 0xFF;
Expand All @@ -100,29 +100,30 @@ void StockObjectsD3D11::Create(ID3D11Device *device) {
depth_desc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_REPLACE;
depth_desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
depth_desc.BackFace = depth_desc.FrontFace;
device->CreateDepthStencilState(&depth_desc, &depthDisabledStencilWrite);
ASSERT_SUCCESS(device->CreateDepthStencilState(&depth_desc, &depthDisabledStencilWrite));

D3D11_RASTERIZER_DESC raster_desc{};
raster_desc.FillMode = D3D11_FILL_SOLID;
raster_desc.CullMode = D3D11_CULL_NONE;
raster_desc.ScissorEnable = FALSE;
device->CreateRasterizerState(&raster_desc, &rasterStateNoCull);
raster_desc.DepthClipEnable = TRUE; // the default! FALSE is unsupported on D3D11 level 9
ASSERT_SUCCESS(device->CreateRasterizerState(&raster_desc, &rasterStateNoCull));

D3D11_SAMPLER_DESC sampler_desc{};
sampler_desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
sampler_desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
sampler_desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
sampler_desc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
device->CreateSamplerState(&sampler_desc, &samplerPoint2DWrap);
sampler_desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
device->CreateSamplerState(&sampler_desc, &samplerLinear2DWrap);
ASSERT_SUCCESS(device->CreateSamplerState(&sampler_desc, &samplerPoint2DWrap));
sampler_desc.Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT;
ASSERT_SUCCESS(device->CreateSamplerState(&sampler_desc, &samplerLinear2DWrap));
sampler_desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
sampler_desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
sampler_desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
sampler_desc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
device->CreateSamplerState(&sampler_desc, &samplerPoint2DClamp);
sampler_desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
device->CreateSamplerState(&sampler_desc, &samplerLinear2DClamp);
ASSERT_SUCCESS(device->CreateSamplerState(&sampler_desc, &samplerPoint2DClamp));
sampler_desc.Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT;
ASSERT_SUCCESS(device->CreateSamplerState(&sampler_desc, &samplerLinear2DClamp));
}

void StockObjectsD3D11::Destroy() {
Expand Down
4 changes: 4 additions & 0 deletions GPU/D3D11/D3D11Util.h
Expand Up @@ -84,4 +84,8 @@ class StockObjectsD3D11 {
ID3D11SamplerState *samplerLinear2DClamp;
};

#define ASSERT_SUCCESS(x) \
if (!SUCCEEDED((x))) \
Crash();

extern StockObjectsD3D11 stockD3D11;
14 changes: 3 additions & 11 deletions GPU/D3D11/DepalettizeShaderD3D11.cpp
Expand Up @@ -59,7 +59,7 @@ DepalShaderCacheD3D11::DepalShaderCacheD3D11(ID3D11Device *device, ID3D11DeviceC
std::string errorMessage;
std::vector<uint8_t> vsByteCode;
vertexShader_ = CreateVertexShaderD3D11(device, depalVShaderHLSL, strlen(depalVShaderHLSL), &vsByteCode);
device_->CreateInputLayout(g_DepalVertexElements, ARRAY_SIZE(g_DepalVertexElements), vsByteCode.data(), vsByteCode.size(), &inputLayout_);
ASSERT_SUCCESS(device_->CreateInputLayout(g_DepalVertexElements, ARRAY_SIZE(g_DepalVertexElements), vsByteCode.data(), vsByteCode.size(), &inputLayout_));
}

DepalShaderCacheD3D11::~DepalShaderCacheD3D11() {
Expand Down Expand Up @@ -101,16 +101,8 @@ ID3D11ShaderResourceView *DepalShaderCacheD3D11::GetClutTexture(GEPaletteFormat
data.pSysMem = rawClut;
// Regardless of format, the CLUT should always be 1024 bytes.
data.SysMemPitch = 1024;
HRESULT hr = device_->CreateTexture2D(&desc, &data, &tex->texture);
if (FAILED(hr)) {
ERROR_LOG(G3D, "Failed to create D3D texture for depal");
delete tex;
return nullptr;
}
hr = device_->CreateShaderResourceView(tex->texture, nullptr, &tex->view);
if (FAILED(hr)) {
// ...
}
ASSERT_SUCCESS(device_->CreateTexture2D(&desc, &data, &tex->texture));
ASSERT_SUCCESS(device_->CreateShaderResourceView(tex->texture, nullptr, &tex->view));
tex->lastFrame = gpuStats.numFlips;
texCache_[realClutID] = tex;
return tex->view;
Expand Down
7 changes: 4 additions & 3 deletions GPU/D3D11/DrawEngineD3D11.cpp
Expand Up @@ -689,12 +689,12 @@ void DrawEngineD3D11::DoFlush() {
u32 size = dec_->GetDecVtxFmt().stride * indexGen.MaxIndex();
D3D11_BUFFER_DESC desc{ size, D3D11_USAGE_IMMUTABLE, D3D11_BIND_VERTEX_BUFFER, 0 };
D3D11_SUBRESOURCE_DATA data{ decoded };
device_->CreateBuffer(&desc, &data, &vai->vbo);
ASSERT_SUCCESS(device_->CreateBuffer(&desc, &data, &vai->vbo));
if (useElements) {
u32 size = sizeof(short) * indexGen.VertexCount();
D3D11_BUFFER_DESC desc{ size, D3D11_USAGE_IMMUTABLE, D3D11_BIND_INDEX_BUFFER, 0 };
D3D11_SUBRESOURCE_DATA data{ decIndex };
device_->CreateBuffer(&desc, &data, &vai->ebo);
ASSERT_SUCCESS(device_->CreateBuffer(&desc, &data, &vai->ebo));
} else {
vai->ebo = 0;
}
Expand Down Expand Up @@ -873,7 +873,7 @@ void DrawEngineD3D11::DoFlush() {
auto iter = inputLayoutMap_.find(key);
ID3D11InputLayout *layout;
if (iter == inputLayoutMap_.end()) {
device_->CreateInputLayout(TransformedVertexElements, ARRAY_SIZE(TransformedVertexElements), vshader->bytecode().data(), vshader->bytecode().size(), &layout);
ASSERT_SUCCESS(device_->CreateInputLayout(TransformedVertexElements, ARRAY_SIZE(TransformedVertexElements), vshader->bytecode().data(), vshader->bytecode().size(), &layout));
inputLayoutMap_[key] = layout;
} else {
layout = iter->second;
Expand Down Expand Up @@ -984,6 +984,7 @@ void DrawEngineD3D11::TessellationDataTransferD3D11::SendDataToShader(const floa
return; // TODO: Turn off HW tessellation if texture creation error occured.
}
hr = device_->CreateShaderResourceView(data_tex[0], nullptr, &view[0]);
ASSERT_SUCCESS(hr);
context_->VSSetShaderResources(0, 1, &view[0]);
}
dstBox.right = size;
Expand Down
24 changes: 12 additions & 12 deletions GPU/D3D11/FramebufferManagerD3D11.cpp
Expand Up @@ -104,7 +104,7 @@ FramebufferManagerD3D11::FramebufferManagerD3D11(Draw::DrawContext *draw)
std::string errorMsg;
quadVertexShader_ = CreateVertexShaderD3D11(device_, vscode, strlen(vscode), &bytecode);
quadPixelShader_ = CreatePixelShaderD3D11(device_, pscode, strlen(pscode));
device_->CreateInputLayout(g_QuadVertexElements, ARRAY_SIZE(g_QuadVertexElements), bytecode.data(), bytecode.size(), &quadInputLayout_);
ASSERT_SUCCESS(device_->CreateInputLayout(g_QuadVertexElements, ARRAY_SIZE(g_QuadVertexElements), bytecode.data(), bytecode.size(), &quadInputLayout_));

// STRIP geometry
static const float fsCoord[20] = {
Expand All @@ -119,14 +119,14 @@ FramebufferManagerD3D11::FramebufferManagerD3D11(Draw::DrawContext *draw)
vb.CPUAccessFlags = 0;
vb.BindFlags = D3D11_BIND_VERTEX_BUFFER;
D3D11_SUBRESOURCE_DATA data{ fsCoord };
device_->CreateBuffer(&vb, &data, &fsQuadBuffer_);
ASSERT_SUCCESS(device_->CreateBuffer(&vb, &data, &fsQuadBuffer_));
vb.Usage = D3D11_USAGE_DYNAMIC;
vb.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
device_->CreateBuffer(&vb, nullptr, &quadBuffer_);
ASSERT_SUCCESS(device_->CreateBuffer(&vb, nullptr, &quadBuffer_));
vb.ByteWidth = ROUND_UP(sizeof(PostShaderUniforms), 16);
vb.Usage = D3D11_USAGE_DYNAMIC;
vb.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
device_->CreateBuffer(&vb, nullptr, &postConstants_);
ASSERT_SUCCESS(device_->CreateBuffer(&vb, nullptr, &postConstants_));

ShaderTranslationInit();

Expand All @@ -142,7 +142,7 @@ FramebufferManagerD3D11::FramebufferManagerD3D11(Draw::DrawContext *draw)
packDesc.Usage = D3D11_USAGE_STAGING;
packDesc.SampleDesc.Count = 1;
packDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
device_->CreateTexture2D(&packDesc, nullptr, &packTexture_);
ASSERT_SUCCESS(device_->CreateTexture2D(&packDesc, nullptr, &packTexture_));
}

FramebufferManagerD3D11::~FramebufferManagerD3D11() {
Expand Down Expand Up @@ -280,7 +280,7 @@ void FramebufferManagerD3D11::CompilePostShader() {
postVertexShader_->Release();
return;
}
device_->CreateInputLayout(g_PostVertexElements, 2, byteCode.data(), byteCode.size(), &postInputLayout_);
ASSERT_SUCCESS(device_->CreateInputLayout(g_PostVertexElements, 2, byteCode.data(), byteCode.size(), &postInputLayout_));
usePostShader_ = true;
}

Expand All @@ -307,8 +307,8 @@ void FramebufferManagerD3D11::MakePixelTexture(const u8 *srcPixels, GEBufferForm
desc.SampleDesc.Count = 1;
desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
device_->CreateTexture2D(&desc, nullptr, &drawPixelsTex_);
device_->CreateShaderResourceView(drawPixelsTex_, nullptr, &drawPixelsTexView_);
ASSERT_SUCCESS(device_->CreateTexture2D(&desc, nullptr, &drawPixelsTex_));
ASSERT_SUCCESS(device_->CreateShaderResourceView(drawPixelsTex_, nullptr, &drawPixelsTexView_));
drawPixelsTexW_ = width;
drawPixelsTexH_ = height;
}
Expand Down Expand Up @@ -458,7 +458,7 @@ void FramebufferManagerD3D11::BindPostShader(const PostShaderUniforms &uniforms)
context_->VSSetShader(postVertexShader_, 0, 0);

D3D11_MAPPED_SUBRESOURCE map;
context_->Map(postConstants_, 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
ASSERT_SUCCESS(context_->Map(postConstants_, 0, D3D11_MAP_WRITE_DISCARD, 0, &map));
memcpy(map.pData, &uniforms, sizeof(uniforms));
context_->Unmap(postConstants_, 0);
context_->VSSetConstantBuffers(0, 1, &postConstants_); // Probably not necessary
Expand Down Expand Up @@ -1026,7 +1026,7 @@ bool FramebufferManagerD3D11::GetFramebuffer(u32 fb_address, int fb_stride, GEBu
packDesc.Usage = D3D11_USAGE_STAGING;
packDesc.SampleDesc.Count = 1;
packDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
device_->CreateTexture2D(&packDesc, nullptr, &packTex);
ASSERT_SUCCESS(device_->CreateTexture2D(&packDesc, nullptr, &packTex));

ID3D11Texture2D *nativeTex = (ID3D11Texture2D *)draw_->GetFramebufferAPITexture(fboForRead, Draw::FB_COLOR_BIT, 0);
context_->CopyResource(packTex, nativeTex);
Expand Down Expand Up @@ -1067,7 +1067,7 @@ bool FramebufferManagerD3D11::GetDepthStencilBuffer(VirtualFramebuffer *vfb, GPU
packDesc.Usage = D3D11_USAGE_STAGING;
packDesc.SampleDesc.Count = 1;
packDesc.Format = (DXGI_FORMAT)draw_->GetFramebufferAPITexture(fboForRead, Draw::FB_DEPTH_BIT | Draw::FB_FORMAT_BIT, 0);
device_->CreateTexture2D(&packDesc, nullptr, &packTex);
ASSERT_SUCCESS(device_->CreateTexture2D(&packDesc, nullptr, &packTex));

ID3D11Texture2D *nativeTex = (ID3D11Texture2D *)draw_->GetFramebufferAPITexture(fboForRead, Draw::FB_DEPTH_BIT, 0);
context_->CopyResource(packTex, nativeTex);
Expand Down Expand Up @@ -1147,7 +1147,7 @@ bool FramebufferManagerD3D11::GetOutputFramebuffer(GPUDebugBuffer &buffer) {
packDesc.Usage = D3D11_USAGE_STAGING;
packDesc.SampleDesc.Count = 1;
packDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
device_->CreateTexture2D(&packDesc, nullptr, &packTex);
ASSERT_SUCCESS(device_->CreateTexture2D(&packDesc, nullptr, &packTex));

context_->CopyResource(packTex, backbuffer);

Expand Down
6 changes: 3 additions & 3 deletions GPU/D3D11/ShaderManagerD3D11.cpp
Expand Up @@ -99,11 +99,11 @@ ShaderManagerD3D11::ShaderManagerD3D11(ID3D11Device *device, ID3D11DeviceContext
ILOG("sizeof(ub_bones): %d", (int)sizeof(ub_bones));

D3D11_BUFFER_DESC desc{sizeof(ub_base), D3D11_USAGE_DYNAMIC, D3D11_BIND_CONSTANT_BUFFER, D3D11_CPU_ACCESS_WRITE };
device_->CreateBuffer(&desc, nullptr, &push_base);
ASSERT_SUCCESS(device_->CreateBuffer(&desc, nullptr, &push_base));
desc.ByteWidth = sizeof(ub_lights);
device_->CreateBuffer(&desc, nullptr, &push_lights);
ASSERT_SUCCESS(device_->CreateBuffer(&desc, nullptr, &push_lights));
desc.ByteWidth = sizeof(ub_bones);
device_->CreateBuffer(&desc, nullptr, &push_bones);
ASSERT_SUCCESS(device_->CreateBuffer(&desc, nullptr, &push_bones));
}

ShaderManagerD3D11::~ShaderManagerD3D11() {
Expand Down
8 changes: 4 additions & 4 deletions GPU/D3D11/StateMappingD3D11.cpp
Expand Up @@ -373,7 +373,7 @@ void DrawEngineD3D11::ApplyDrawState(int prim) {
rt.SrcBlendAlpha = (D3D11_BLEND)keys_.blend.srcAlpha;
rt.DestBlendAlpha = (D3D11_BLEND)keys_.blend.destAlpha;
rt.RenderTargetWriteMask = keys_.blend.colorWriteMask;
device_->CreateBlendState(&desc, &bs);
ASSERT_SUCCESS(device_->CreateBlendState(&desc, &bs));
blendCache_.insert(std::pair<uint64_t, ID3D11BlendState *>(keys_.blend.value, bs));
} else {
bs = blendIter->second;
Expand All @@ -394,7 +394,7 @@ void DrawEngineD3D11::ApplyDrawState(int prim) {
rt.RenderTargetWriteMask = keys_.blend.colorWriteMask;
rt.LogicOpEnable = keys_.blend.logicOpEnable;
rt.LogicOp = (D3D11_LOGIC_OP)keys_.blend.logicOp;
device1_->CreateBlendState1(&desc1, &bs1);
ASSERT_SUCCESS(device1_->CreateBlendState1(&desc1, &bs1));
blendCache1_.insert(std::pair<uint64_t, ID3D11BlendState1 *>(keys_.blend.value, bs1));
} else {
bs1 = blendIter->second;
Expand All @@ -416,7 +416,7 @@ void DrawEngineD3D11::ApplyDrawState(int prim) {
desc.FrontFace.StencilDepthFailOp = (D3D11_STENCIL_OP)keys_.depthStencil.stencilDepthFailOp;
desc.FrontFace.StencilFunc = (D3D11_COMPARISON_FUNC)keys_.depthStencil.stencilCompareFunc;
desc.BackFace = desc.FrontFace;
device_->CreateDepthStencilState(&desc, &ds);
ASSERT_SUCCESS(device_->CreateDepthStencilState(&desc, &ds));
depthStencilCache_.insert(std::pair<uint64_t, ID3D11DepthStencilState *>(keys_.depthStencil.value, ds));
} else {
ds = depthIter->second;
Expand All @@ -431,7 +431,7 @@ void DrawEngineD3D11::ApplyDrawState(int prim) {
desc.ScissorEnable = TRUE;
desc.FrontCounterClockwise = TRUE;
desc.DepthClipEnable = TRUE;
device_->CreateRasterizerState(&desc, &rs);
ASSERT_SUCCESS(device_->CreateRasterizerState(&desc, &rs));
rasterCache_.insert(std::pair<uint32_t, ID3D11RasterizerState *>(keys_.raster.value, rs));
} else {
rs = rasterIter->second;
Expand Down
4 changes: 2 additions & 2 deletions GPU/D3D11/StencilBufferD3D11.cpp
Expand Up @@ -175,15 +175,15 @@ bool FramebufferManagerD3D11::NotifyStencilUpload(u32 addr, int size, bool skipZ
std::string errorMessage;
std::vector<uint8_t> byteCode;
stencilUploadVS_ = CreateVertexShaderD3D11(device_, stencil_vs, strlen(stencil_vs), &byteCode);
device_->CreateInputLayout(g_QuadVertexElements, 2, byteCode.data(), byteCode.size(), &stencilUploadInputLayout_);
ASSERT_SUCCESS(device_->CreateInputLayout(g_QuadVertexElements, 2, byteCode.data(), byteCode.size(), &stencilUploadInputLayout_));
}
if (!stencilValueBuffer_) {
D3D11_BUFFER_DESC desc{};
desc.ByteWidth = sizeof(StencilValueUB);
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
device_->CreateBuffer(&desc, nullptr, &stencilValueBuffer_);
ASSERT_SUCCESS(device_->CreateBuffer(&desc, nullptr, &stencilValueBuffer_));
}

shaderManagerD3D11_->DirtyLastShader();
Expand Down
9 changes: 2 additions & 7 deletions GPU/D3D11/TextureCacheD3D11.cpp
Expand Up @@ -669,14 +669,9 @@ void TextureCacheD3D11::LoadTextureLevel(TexCacheEntry &entry, ReplacedTexture &
desc.MipLevels = levels;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;

HRESULT hr = device_->CreateTexture2D(&desc, nullptr, &texture);
if (FAILED(hr)) {
INFO_LOG(G3D, "Failed to create D3D texture");
ReleaseTexture(&entry, true);
return;
}
ASSERT_SUCCESS(device_->CreateTexture2D(&desc, nullptr, &texture));
ID3D11ShaderResourceView *view;
hr = device_->CreateShaderResourceView(texture, nullptr, &view);
ASSERT_SUCCESS(device_->CreateShaderResourceView(texture, nullptr, &view));
entry.texturePtr = texture;
entry.textureView = view;
}
Expand Down

0 comments on commit 9d11650

Please sign in to comment.