Fix UV scale for some vertex formats (like GL). Separate updates of PROJ and PROJTHROUGH matrices.
This commit is contained in:
parent
c770349475
commit
5cee8856ea
4 changed files with 32 additions and 30 deletions
|
@ -122,7 +122,7 @@ void ComputeVertexShaderID(ShaderID *id_out, u32 vertType, bool useHWTransform)
|
||||||
if (doTextureProjection && gstate.getUVProjMode() == GE_PROJMAP_UV) {
|
if (doTextureProjection && gstate.getUVProjMode() == GE_PROJMAP_UV) {
|
||||||
id.SetBits(VS_BIT_TEXCOORD_FMTSCALE, 2, (vertType & GE_VTYPE_TC_MASK) >> GE_VTYPE_TC_SHIFT); // two bits
|
id.SetBits(VS_BIT_TEXCOORD_FMTSCALE, 2, (vertType & GE_VTYPE_TC_MASK) >> GE_VTYPE_TC_SHIFT); // two bits
|
||||||
} else {
|
} else {
|
||||||
id.SetBits(VS_BIT_TEXCOORD_FMTSCALE, 2, 3);
|
id.SetBits(VS_BIT_TEXCOORD_FMTSCALE, 2, 3); // float - no scaling
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -102,7 +102,6 @@ void GenerateVertexShaderDX9(const ShaderID &id, char *buffer) {
|
||||||
if (enableBones) {
|
if (enableBones) {
|
||||||
numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3);
|
numBoneWeights = 1 + id.Bits(VS_BIT_BONES, 3);
|
||||||
}
|
}
|
||||||
int texFmtScale = id.Bits(VS_BIT_TEXCOORD_FMTSCALE, 2);
|
|
||||||
|
|
||||||
WRITE(p, "#pragma warning( disable : 3571 )\n");
|
WRITE(p, "#pragma warning( disable : 3571 )\n");
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,7 @@ DrawEngineVulkan::DrawEngineVulkan(VulkanContext *vulkan)
|
||||||
curFrame_(0) {
|
curFrame_(0) {
|
||||||
|
|
||||||
memset(&decOptions_, 0, sizeof(decOptions_));
|
memset(&decOptions_, 0, sizeof(decOptions_));
|
||||||
decOptions_.expandAllUVtoFloat = false;
|
decOptions_.expandAllUVtoFloat = false; // this may be a good idea though.
|
||||||
decOptions_.expandAllWeightsToFloat = false;
|
decOptions_.expandAllWeightsToFloat = false;
|
||||||
decOptions_.expand8BitNormalsToFloat = false;
|
decOptions_.expand8BitNormalsToFloat = false;
|
||||||
|
|
||||||
|
|
|
@ -242,34 +242,33 @@ void ShaderManagerVulkan::BaseUpdateUniforms(int dirtyUniforms) {
|
||||||
CopyFloat2(ub_base.texClampOffset, texclampoff);
|
CopyFloat2(ub_base.texClampOffset, texclampoff);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update any dirty uniforms before we draw
|
|
||||||
if (dirtyUniforms & DIRTY_PROJMATRIX) {
|
if (dirtyUniforms & DIRTY_PROJMATRIX) {
|
||||||
if (gstate.isModeThrough()) {
|
Matrix4x4 flippedMatrix;
|
||||||
Matrix4x4 proj_through;
|
memcpy(&flippedMatrix, gstate.projMatrix, 16 * sizeof(float));
|
||||||
proj_through.setOrtho(0.0f, gstate_c.curRTWidth, 0, gstate_c.curRTHeight, 0, 1);
|
|
||||||
ConvertProjMatrixToVulkanThrough(proj_through);
|
|
||||||
CopyMatrix4x4(ub_base.proj_through, proj_through.getReadPtr());
|
|
||||||
} else {
|
|
||||||
Matrix4x4 flippedMatrix;
|
|
||||||
memcpy(&flippedMatrix, gstate.projMatrix, 16 * sizeof(float));
|
|
||||||
|
|
||||||
const bool invertedY = gstate_c.vpHeight < 0;
|
const bool invertedY = gstate_c.vpHeight < 0;
|
||||||
if (invertedY) {
|
if (invertedY) {
|
||||||
flippedMatrix[1] = -flippedMatrix[1];
|
flippedMatrix[1] = -flippedMatrix[1];
|
||||||
flippedMatrix[5] = -flippedMatrix[5];
|
flippedMatrix[5] = -flippedMatrix[5];
|
||||||
flippedMatrix[9] = -flippedMatrix[9];
|
flippedMatrix[9] = -flippedMatrix[9];
|
||||||
flippedMatrix[13] = -flippedMatrix[13];
|
flippedMatrix[13] = -flippedMatrix[13];
|
||||||
}
|
|
||||||
const bool invertedX = gstate_c.vpWidth < 0;
|
|
||||||
if (invertedX) {
|
|
||||||
flippedMatrix[0] = -flippedMatrix[0];
|
|
||||||
flippedMatrix[4] = -flippedMatrix[4];
|
|
||||||
flippedMatrix[8] = -flippedMatrix[8];
|
|
||||||
flippedMatrix[12] = -flippedMatrix[12];
|
|
||||||
}
|
|
||||||
ConvertProjMatrixToVulkan(flippedMatrix, invertedX, invertedY);
|
|
||||||
CopyMatrix4x4(ub_base.proj, flippedMatrix.getReadPtr());
|
|
||||||
}
|
}
|
||||||
|
const bool invertedX = gstate_c.vpWidth < 0;
|
||||||
|
if (invertedX) {
|
||||||
|
flippedMatrix[0] = -flippedMatrix[0];
|
||||||
|
flippedMatrix[4] = -flippedMatrix[4];
|
||||||
|
flippedMatrix[8] = -flippedMatrix[8];
|
||||||
|
flippedMatrix[12] = -flippedMatrix[12];
|
||||||
|
}
|
||||||
|
ConvertProjMatrixToVulkan(flippedMatrix, invertedX, invertedY);
|
||||||
|
CopyMatrix4x4(ub_base.proj, flippedMatrix.getReadPtr());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dirtyUniforms & DIRTY_PROJTHROUGHMATRIX) {
|
||||||
|
Matrix4x4 proj_through;
|
||||||
|
proj_through.setOrtho(0.0f, gstate_c.curRTWidth, 0, gstate_c.curRTHeight, 0, 1);
|
||||||
|
ConvertProjMatrixToVulkanThrough(proj_through);
|
||||||
|
CopyMatrix4x4(ub_base.proj_through, proj_through.getReadPtr());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Transform
|
// Transform
|
||||||
|
@ -315,13 +314,17 @@ void ShaderManagerVulkan::BaseUpdateUniforms(int dirtyUniforms) {
|
||||||
const float widthFactor = (float)w * invW;
|
const float widthFactor = (float)w * invW;
|
||||||
const float heightFactor = (float)h * invH;
|
const float heightFactor = (float)h * invH;
|
||||||
|
|
||||||
|
static const float rescale[4] = { 1.0f, 2 * 127.5f / 128.f, 2 * 32767.5f / 32768.f, 1.0f };
|
||||||
|
const float factor = rescale[(gstate.vertType & GE_VTYPE_TC_MASK) >> GE_VTYPE_TC_SHIFT];
|
||||||
|
|
||||||
float uvscaleoff[4];
|
float uvscaleoff[4];
|
||||||
|
|
||||||
switch (gstate.getUVGenMode()) {
|
switch (gstate.getUVGenMode()) {
|
||||||
case GE_TEXMAP_TEXTURE_COORDS:
|
case GE_TEXMAP_TEXTURE_COORDS:
|
||||||
// Not sure what GE_TEXMAP_UNKNOWN is, but seen in Riviera. Treating the same as GE_TEXMAP_TEXTURE_COORDS works.
|
// Not sure what GE_TEXMAP_UNKNOWN is, but seen in Riviera. Treating the same as GE_TEXMAP_TEXTURE_COORDS works.
|
||||||
case GE_TEXMAP_UNKNOWN:
|
case GE_TEXMAP_UNKNOWN:
|
||||||
uvscaleoff[0] = gstate_c.uv.uScale * widthFactor;
|
uvscaleoff[0] = gstate_c.uv.uScale * factor * widthFactor;
|
||||||
uvscaleoff[1] = gstate_c.uv.vScale * heightFactor;
|
uvscaleoff[1] = gstate_c.uv.vScale * factor * heightFactor;
|
||||||
uvscaleoff[2] = gstate_c.uv.uOff * widthFactor;
|
uvscaleoff[2] = gstate_c.uv.uOff * widthFactor;
|
||||||
uvscaleoff[3] = gstate_c.uv.vOff * heightFactor;
|
uvscaleoff[3] = gstate_c.uv.vOff * heightFactor;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue