mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-07-11 01:25:07 +02:00
Merge pull request #19764 from hrydgard/even-more-depth-raster-stuff
Enable depth raster in all backends
This commit is contained in:
@@ -172,7 +172,7 @@ struct Vec4U16 {
|
||||
Vec4U16 operator ^(Vec4U16 other) const { return Vec4U16{ _mm_xor_si128(v, other.v) }; }
|
||||
|
||||
Vec4U16 Max(Vec4U16 other) const { return Vec4U16{ _mm_max_epu16_SSE2(v, other.v) }; }
|
||||
Vec4U16 Min(Vec4U16 other) const { return Vec4U16{ _mm_max_epu16_SSE2(v, other.v) }; }
|
||||
Vec4U16 Min(Vec4U16 other) const { return Vec4U16{ _mm_min_epu16_SSE2(v, other.v) }; }
|
||||
Vec4U16 CompareLT(Vec4U16 other) { return Vec4U16{ _mm_cmplt_epu16(v, other.v) }; }
|
||||
};
|
||||
|
||||
|
||||
@@ -199,7 +199,7 @@ TriangleResult DepthRasterTriangle(uint16_t *depthBuf, int stride, int x1, int y
|
||||
switch (compareMode) {
|
||||
case ZCompareMode::Greater:
|
||||
// To implement the greater/greater-than comparison, we can combine mask and max.
|
||||
// It might be better to do the math in float space on x86 due to SSE2 deficiencies.
|
||||
// Unfortunately there's no unsigned max on SSE2, it's synthesized by xoring 0x8000 on input and output.
|
||||
// We use AndNot to zero out Z results, before doing Max with the buffer.
|
||||
AndNot(shortZ, shortMaskInv).Max(bufferValues).Store(rowPtr + x);
|
||||
break;
|
||||
|
||||
@@ -335,6 +335,9 @@ void DrawEngineD3D11::Flush() {
|
||||
context_->Draw(vertexCount, 0);
|
||||
}
|
||||
}
|
||||
if (useDepthRaster_) {
|
||||
DepthRasterTransform(prim, dec_, dec_->VertexType(), vertexCount);
|
||||
}
|
||||
} else {
|
||||
PROFILE_THIS_SCOPE("soft");
|
||||
VertexDecoder *swDec = dec_;
|
||||
@@ -388,6 +391,13 @@ void DrawEngineD3D11::Flush() {
|
||||
UpdateCachedViewportState(vpAndScissor);
|
||||
}
|
||||
|
||||
// At this point, rect and line primitives are still preserved as such. So, it's the best time to do software depth raster.
|
||||
// We could piggyback on the viewport transform below, but it gets complicated since it's different per-backend. Which we really
|
||||
// should clean up one day...
|
||||
if (useDepthRaster_) {
|
||||
DepthRasterPredecoded(prim, decoded_, numDecodedVerts_, swDec, vertexCount);
|
||||
}
|
||||
|
||||
SoftwareTransform swTransform(params);
|
||||
|
||||
const Lin::Vec3 trans(gstate_c.vpXOffset, -gstate_c.vpYOffset, gstate_c.vpZOffset * 0.5f + 0.5f);
|
||||
|
||||
@@ -292,6 +292,9 @@ void DrawEngineDX9::Flush() {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (useDepthRaster_) {
|
||||
DepthRasterTransform(prim, dec_, dec_->VertexType(), vertexCount);
|
||||
}
|
||||
} else {
|
||||
VertexDecoder *swDec = dec_;
|
||||
if (swDec->nweights != 0) {
|
||||
@@ -344,6 +347,13 @@ void DrawEngineDX9::Flush() {
|
||||
UpdateCachedViewportState(vpAndScissor);
|
||||
}
|
||||
|
||||
// At this point, rect and line primitives are still preserved as such. So, it's the best time to do software depth raster.
|
||||
// We could piggyback on the viewport transform below, but it gets complicated since it's different per-backend. Which we really
|
||||
// should clean up one day...
|
||||
if (useDepthRaster_) {
|
||||
DepthRasterPredecoded(prim, decoded_, numDecodedVerts_, swDec, vertexCount);
|
||||
}
|
||||
|
||||
int maxIndex = numDecodedVerts_;
|
||||
SoftwareTransform swTransform(params);
|
||||
|
||||
|
||||
@@ -315,6 +315,9 @@ void DrawEngineGLES::Flush() {
|
||||
inputLayout, vertexBuffer, vertexBufferOffset,
|
||||
glprim[prim], 0, vertexCount);
|
||||
}
|
||||
if (useDepthRaster_) {
|
||||
DepthRasterTransform(prim, dec_, dec_->VertexType(), vertexCount);
|
||||
}
|
||||
} else {
|
||||
PROFILE_THIS_SCOPE("soft");
|
||||
VertexDecoder *swDec = dec_;
|
||||
@@ -371,6 +374,13 @@ void DrawEngineGLES::Flush() {
|
||||
}
|
||||
}
|
||||
|
||||
// At this point, rect and line primitives are still preserved as such. So, it's the best time to do software depth raster.
|
||||
// We could piggyback on the viewport transform below, but it gets complicated since it's different per-backend. Which we really
|
||||
// should clean up one day...
|
||||
if (useDepthRaster_) {
|
||||
DepthRasterPredecoded(prim, decoded_, numDecodedVerts_, swDec, vertexCount);
|
||||
}
|
||||
|
||||
SoftwareTransform swTransform(params);
|
||||
|
||||
const Lin::Vec3 trans(gstate_c.vpXOffset, gstate_c.vpYOffset, gstate_c.vpZOffset);
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
#include "pch.h"
|
||||
#include "lua.h"
|
||||
@@ -1 +0,0 @@
|
||||
#pragma once
|
||||
@@ -1 +0,0 @@
|
||||
#include "pch.h"
|
||||
@@ -1,9 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "targetver.h"
|
||||
|
||||
#ifndef WIN32_LEAN_AND_MEAN
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#endif
|
||||
|
||||
#include <windows.h>
|
||||
@@ -1,8 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
// Including SDKDDKVer.h defines the highest available Windows platform.
|
||||
|
||||
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
|
||||
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
|
||||
|
||||
#include <SDKDDKVer.h>
|
||||
Reference in New Issue
Block a user