Fix indexed drawing, flip rendering the right side up, enable culling

This commit is contained in:
Henrik Rydgard 2016-01-09 12:37:05 +01:00
parent 6141c3651b
commit 6b8c004561
5 changed files with 7 additions and 18 deletions

View file

@ -544,7 +544,7 @@ void DrawEngineVulkan::DoFlush(VkCommandBuffer cmd) {
// Might want to separate vertices out into a different push buffer in that case.
vkCmdBindVertexBuffers(cmd_, 0, 1, buf, offsets);
vkCmdBindIndexBuffer(cmd_, buf[0], ibOffset, VK_INDEX_TYPE_UINT16);
vkCmdDrawIndexed(cmd_, maxIndex, 1, 0, 0, 0);
vkCmdDrawIndexed(cmd_, indexGen.VertexCount(), 1, 0, 0, 0);
} else {
vkCmdBindVertexBuffers(cmd_, 0, 1, buf, offsets);
vkCmdDraw(cmd_, vertexCount, 1, 0, 0);

View file

@ -501,9 +501,8 @@ void GPU_Vulkan::BeginHostFrame() {
} else if (dumpThisFrame_) {
dumpThisFrame_ = false;
}
shaderManager_->DirtyShader();
// Not sure if this is really needed.
shaderManager_->DirtyShader();
shaderManager_->DirtyUniform(DIRTY_ALL);
framebufferManager_.BeginFrame();

View file

@ -182,21 +182,15 @@ ShaderManagerVulkan::~ShaderManagerVulkan() {
}
uint32_t ShaderManagerVulkan::PushBaseBuffer(VulkanPushBuffer *dest) {
if (globalDirty_ & DIRTY_BASE_UNIFORMS)
BaseUpdateUniforms(globalDirty_);
return dest->PushAligned(&ub_base, sizeof(ub_base), uboAlignment_);
}
uint32_t ShaderManagerVulkan::PushLightBuffer(VulkanPushBuffer *dest) {
if (globalDirty_ & DIRTY_BASE_UNIFORMS)
BaseUpdateUniforms(globalDirty_);
return dest->PushAligned(&ub_lights, sizeof(ub_lights), uboAlignment_);
}
// TODO: Only push half the bone buffer if we only have four bones.
uint32_t ShaderManagerVulkan::PushBoneBuffer(VulkanPushBuffer *dest) {
if (globalDirty_ & DIRTY_BASE_UNIFORMS)
BaseUpdateUniforms(globalDirty_);
return dest->PushAligned(&ub_bones, sizeof(ub_bones), uboAlignment_);
}
@ -255,7 +249,7 @@ void ShaderManagerVulkan::BaseUpdateUniforms(int dirtyUniforms) {
memcpy(&flippedMatrix, gstate.projMatrix, 16 * sizeof(float));
const bool invertedY = gstate_c.vpHeight < 0;
if (!invertedY) {
if (invertedY) {
flippedMatrix[1] = -flippedMatrix[1];
flippedMatrix[5] = -flippedMatrix[5];
flippedMatrix[9] = -flippedMatrix[9];
@ -401,7 +395,7 @@ void ShaderManagerVulkan::LightUpdateUniforms(int dirtyUniforms) {
Uint8x3ToFloat4(ub_lights.materialEmissive, gstate.materialemissive);
}
if (dirtyUniforms & DIRTY_MATSPECULAR) {
Uint8x3ToFloat4_Alpha(ub_lights.materialEmissive, gstate.materialspecular, getFloat24(gstate.materialspecularcoef));
Uint8x3ToFloat4_Alpha(ub_lights.materialSpecular, gstate.materialspecular, getFloat24(gstate.materialspecularcoef));
}
for (int i = 0; i < 4; i++) {
@ -449,10 +443,10 @@ void ShaderManagerVulkan::Clear() {
}
fsCache_.clear();
vsCache_.clear();
globalDirty_ = 0xFFFFFFFF;
lastFSID_.clear();
lastVSID_.clear();
DirtyShader();
DirtyUniform(0xFFFFFFFF);
}
void ShaderManagerVulkan::ClearCache(bool deleteThem) {
@ -466,7 +460,6 @@ void ShaderManagerVulkan::DirtyShader() {
lastVSID_.clear();
lastVShader_ = nullptr;
lastFShader_ = nullptr;
globalDirty_ = 0xFFFFFFFF;
}
void ShaderManagerVulkan::DirtyLastShader() { // disables vertex arrays
@ -485,8 +478,8 @@ void ShaderManagerVulkan::UpdateUniforms() {
void ShaderManagerVulkan::GetShaders(int prim, u32 vertType, VulkanVertexShader **vshader, VulkanFragmentShader **fshader, bool useHWTransform) {
ShaderID VSID;
ComputeVertexShaderID(&VSID, vertType, useHWTransform);
ShaderID FSID;
ComputeVertexShaderID(&VSID, vertType, useHWTransform);
ComputeFragmentShaderID(&FSID);
// Just update uniforms if this is the same shader as last time.

View file

@ -188,9 +188,6 @@ void ConvertStateToVulkanKey(FramebufferManagerVulkan &fbManager, int prim, Vulk
bool wantCull = !gstate.isModeThrough() && prim != GE_PRIM_RECTANGLES && gstate.isCullEnabled();
key.cullMode = wantCull ? (gstate.getCullMode() ? VK_CULL_MODE_FRONT_BIT : VK_CULL_MODE_BACK_BIT) : VK_CULL_MODE_NONE;
// TODO: Remove (For debugging)
key.cullMode = VK_CULL_MODE_NONE;
// Depth Test
if (gstate.isDepthTestEnabled()) {
key.depthTestEnable = true;

View file

@ -93,7 +93,7 @@ VkSampler SamplerCache::GetOrCreateSampler(const SamplerCacheKey &key) {
samp.minFilter = key.minFilt ? VK_FILTER_LINEAR : VK_FILTER_NEAREST; // TODO: Aniso
samp.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST; // key.4) ? ((key.magFilt & 2) ? VK_SAMPLER_MIPMAP_MODE_LINEAR : VK_SAMPLER_MIPMAP_MODE_NEAREST) : VK_SAMPLER_MIPMAP_MODE_BASE;
samp.maxAnisotropy = 1.0f;
samp.maxLod = 1000.0f;
samp.maxLod = 0.0f; // 1000.0f;
samp.minLod = 0.0f;
samp.unnormalizedCoordinates = false;
samp.mipLodBias = 0.0f;