mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-01 14:58:14 +00:00
Move the depth raster code around a bit in DrawEngineCommon for easier changes
This commit is contained in:
1 parent
7d50755a32
commit
aa93b48cd3
3 files changed
+84
-70
No files matched your search
@@ -28,6 +28,7 @@ using namespace PPSSPP_VK;
|
||||
|
||||
// renderPass is an example of the "compatibility class" or RenderPassType type.
|
||||
bool VKRGraphicsPipeline::Create(VulkanContext *vulkan, VkRenderPass compatibleRenderPass, RenderPassType rpType, VkSampleCountFlagBits sampleCount, double scheduleTime, int countToCompile) {
|
||||
_dbg_assert_(desc);
|
||||
// Good torture test to test the shutdown-while-precompiling-shaders issue on PC where it's normally
|
||||
// hard to catch because shaders compile so fast.
|
||||
// sleep_ms(200);
|
||||
|
||||
@@ -1001,6 +1001,66 @@ bool DrawEngineCommon::CalculateDepthDraw(DepthDraw *draw, GEPrimitiveType prim,
|
||||
return true;
|
||||
}
|
||||
|
||||
void DrawEngineCommon::EnqueueDepthDraw(const DepthDraw &draw) {
|
||||
if (depthDraws_.empty()) {
|
||||
rasterTimeStart_ = time_now_d();
|
||||
}
|
||||
|
||||
depthDraws_.push_back(draw);
|
||||
}
|
||||
|
||||
// TODO: Possibly split this in stages, to avoid switching back and forth between clipping and drawing.
|
||||
void DrawEngineCommon::ProcessDepthDraw(const DepthDraw &draw) {
|
||||
int *tx = depthScreenVerts_;
|
||||
int *ty = depthScreenVerts_ + DEPTH_SCREENVERTS_COMPONENT_COUNT;
|
||||
float *tz = (float *)(depthScreenVerts_ + DEPTH_SCREENVERTS_COMPONENT_COUNT * 2);
|
||||
|
||||
int outVertCount = 0;
|
||||
|
||||
const float *vertices = depthTransformed_ + 4 * draw.vertexOffset;
|
||||
const uint16_t *indices = depthIndices_ + draw.indexOffset;
|
||||
|
||||
DepthScissor tileScissor = draw.scissor.Tile(0, 1);
|
||||
|
||||
const bool collectStats = coreCollectDebugStats;
|
||||
const bool lowQ = g_Config.iDepthRasterMode == (int)DepthRasterMode::LOW_QUALITY;
|
||||
|
||||
{
|
||||
TimeCollector collectStat(&gpuStats.msCullDepth, collectStats);
|
||||
switch (draw.prim) {
|
||||
case GE_PRIM_RECTANGLES:
|
||||
outVertCount = DepthRasterClipIndexedRectangles(tx, ty, tz, vertices, indices, draw, tileScissor);
|
||||
break;
|
||||
case GE_PRIM_TRIANGLES:
|
||||
outVertCount = DepthRasterClipIndexedTriangles(tx, ty, tz, vertices, indices, draw, tileScissor);
|
||||
break;
|
||||
default:
|
||||
_dbg_assert_(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
{
|
||||
TimeCollector collectStat(&gpuStats.msRasterizeDepth, collectStats);
|
||||
DepthRasterScreenVerts((uint16_t *)Memory::GetPointerWrite(draw.depthAddr), draw.depthStride, tx, ty, tz, outVertCount, draw, tileScissor, lowQ);
|
||||
}
|
||||
}
|
||||
|
||||
void DrawEngineCommon::FlushQueuedDepth() {
|
||||
if (rasterTimeStart_ != 0.0) {
|
||||
gpuStats.msRasterTimeAvailable += time_now_d() - rasterTimeStart_;
|
||||
rasterTimeStart_ = 0.0;
|
||||
}
|
||||
|
||||
for (const auto &draw : depthDraws_) {
|
||||
ProcessDepthDraw(draw);
|
||||
}
|
||||
|
||||
// Reset queue
|
||||
depthIndexCount_ = 0;
|
||||
depthVertexCount_ = 0;
|
||||
depthDraws_.clear();
|
||||
}
|
||||
|
||||
void DrawEngineCommon::DepthRasterTransform(GEPrimitiveType prim, VertexDecoder *dec, uint32_t vertTypeID, int vertexCount) {
|
||||
if (!gstate.isModeClear() && (!gstate.isDepthTestEnabled() || !gstate.isDepthWriteEnabled())) {
|
||||
return;
|
||||
@@ -1042,13 +1102,7 @@ void DrawEngineCommon::DepthRasterTransform(GEPrimitiveType prim, VertexDecoder
|
||||
depthIndexCount_ += vertexCount;
|
||||
depthVertexCount_ += numDecoded;
|
||||
|
||||
if (depthDraws_.empty()) {
|
||||
rasterTimeStart_ = time_now_d();
|
||||
}
|
||||
|
||||
depthDraws_.push_back(draw);
|
||||
|
||||
// FlushQueuedDepth();
|
||||
EnqueueDepthDraw(draw);
|
||||
}
|
||||
|
||||
void DrawEngineCommon::DepthRasterPredecoded(GEPrimitiveType prim, const void *inVerts, int numDecoded, VertexDecoder *dec, int vertexCount) {
|
||||
@@ -1083,57 +1137,5 @@ void DrawEngineCommon::DepthRasterPredecoded(GEPrimitiveType prim, const void *i
|
||||
depthIndexCount_ += vertexCount;
|
||||
depthVertexCount_ += numDecoded;
|
||||
|
||||
depthDraws_.push_back(draw);
|
||||
|
||||
if (depthDraws_.empty()) {
|
||||
rasterTimeStart_ = time_now_d();
|
||||
}
|
||||
// FlushQueuedDepth();
|
||||
}
|
||||
|
||||
void DrawEngineCommon::FlushQueuedDepth() {
|
||||
if (rasterTimeStart_ != 0.0) {
|
||||
gpuStats.msRasterTimeAvailable += time_now_d() - rasterTimeStart_;
|
||||
rasterTimeStart_ = 0.0;
|
||||
}
|
||||
|
||||
const bool collectStats = coreCollectDebugStats;
|
||||
const bool lowQ = g_Config.iDepthRasterMode == (int)DepthRasterMode::LOW_QUALITY;
|
||||
|
||||
for (const auto &draw : depthDraws_) {
|
||||
int *tx = depthScreenVerts_;
|
||||
int *ty = depthScreenVerts_ + DEPTH_SCREENVERTS_COMPONENT_COUNT;
|
||||
float *tz = (float *)(depthScreenVerts_ + DEPTH_SCREENVERTS_COMPONENT_COUNT * 2);
|
||||
|
||||
int outVertCount = 0;
|
||||
|
||||
const float *vertices = depthTransformed_ + 4 * draw.vertexOffset;
|
||||
const uint16_t *indices = depthIndices_ + draw.indexOffset;
|
||||
|
||||
DepthScissor tileScissor = draw.scissor.Tile(0, 1);
|
||||
|
||||
{
|
||||
TimeCollector collectStat(&gpuStats.msCullDepth, collectStats);
|
||||
switch (draw.prim) {
|
||||
case GE_PRIM_RECTANGLES:
|
||||
outVertCount = DepthRasterClipIndexedRectangles(tx, ty, tz, vertices, indices, draw, tileScissor);
|
||||
break;
|
||||
case GE_PRIM_TRIANGLES:
|
||||
outVertCount = DepthRasterClipIndexedTriangles(tx, ty, tz, vertices, indices, draw, tileScissor);
|
||||
break;
|
||||
default:
|
||||
_dbg_assert_(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
{
|
||||
TimeCollector collectStat(&gpuStats.msRasterizeDepth, collectStats);
|
||||
DepthRasterScreenVerts((uint16_t *)Memory::GetPointerWrite(draw.depthAddr), draw.depthStride, tx, ty, tz, outVertCount, draw, tileScissor, lowQ);
|
||||
}
|
||||
}
|
||||
|
||||
// Reset queue
|
||||
depthIndexCount_ = 0;
|
||||
depthVertexCount_ = 0;
|
||||
depthDraws_.clear();
|
||||
EnqueueDepthDraw(draw);
|
||||
}
|
||||
@@ -80,7 +80,7 @@ public:
|
||||
virtual void BeginFrame();
|
||||
|
||||
void SetGPUCommon(GPUCommon *gpuCommon) {
|
||||
gpuCommon_ = gpuCommon;
|
||||
gpuCommon = gpuCommon;
|
||||
}
|
||||
|
||||
virtual void DeviceLost() = 0;
|
||||
@@ -164,8 +164,6 @@ public:
|
||||
return decoded_ + 12 * 65536;
|
||||
}
|
||||
|
||||
void FlushQueuedDepth();
|
||||
|
||||
protected:
|
||||
virtual bool UpdateUseHWTessellation(bool enabled) const { return enabled; }
|
||||
void UpdatePlanes();
|
||||
@@ -177,10 +175,6 @@ protected:
|
||||
|
||||
void ApplyFramebufferRead(FBOTexState *fboTexState);
|
||||
|
||||
void DepthRasterTransform(GEPrimitiveType prim, VertexDecoder *dec, uint32_t vertTypeID, int vertexCount);
|
||||
void DepthRasterPredecoded(GEPrimitiveType prim, const void *inVerts, int numDecoded, VertexDecoder *dec, int vertexCount);
|
||||
bool CalculateDepthDraw(DepthDraw *draw, GEPrimitiveType prim, int vertexCount);
|
||||
|
||||
static inline int IndexSize(u32 vtype) {
|
||||
const u32 indexType = (vtype & GE_VTYPE_IDX_MASK);
|
||||
if (indexType == GE_VTYPE_IDX_16BIT) {
|
||||
@@ -346,19 +340,36 @@ protected:
|
||||
ComputedPipelineState pipelineState_;
|
||||
|
||||
// Hardware tessellation
|
||||
TessellationDataTransfer *tessDataTransfer;
|
||||
TessellationDataTransfer *tessDataTransfer = nullptr;
|
||||
|
||||
GPUCommon *gpuCommon_;
|
||||
|
||||
// Culling
|
||||
private:
|
||||
Plane8 planes_;
|
||||
Vec2f minOffset_;
|
||||
Vec2f maxOffset_;
|
||||
bool offsetOutsideEdge_;
|
||||
|
||||
GPUCommon *gpuCommon_;
|
||||
// Software depth raster. TODO: Extract?
|
||||
public:
|
||||
// Public interface
|
||||
void FlushQueuedDepth();
|
||||
|
||||
protected:
|
||||
// Interface used by the backends.
|
||||
void DepthRasterTransform(GEPrimitiveType prim, VertexDecoder *dec, uint32_t vertTypeID, int vertexCount);
|
||||
void DepthRasterPredecoded(GEPrimitiveType prim, const void *inVerts, int numDecoded, VertexDecoder *dec, int vertexCount);
|
||||
|
||||
// Software depth raster
|
||||
bool useDepthRaster_ = false;
|
||||
|
||||
private:
|
||||
// Internal implementation details.
|
||||
|
||||
inline void EnqueueDepthDraw(const DepthDraw &draw);
|
||||
inline void ProcessDepthDraw(const DepthDraw &draw);
|
||||
bool CalculateDepthDraw(DepthDraw *draw, GEPrimitiveType prim, int vertexCount);
|
||||
|
||||
float *depthTransformed_ = nullptr;
|
||||
int *depthScreenVerts_ = nullptr;
|
||||
uint16_t *depthIndices_ = nullptr;
|
||||
|
||||
Reference in new issue
Block a user