mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
d3d: Share the bounding box code.
This commit is contained in:
parent
f0c37e3f61
commit
64d955ea49
8 changed files with 180 additions and 204 deletions
|
@ -1,20 +1,109 @@
|
|||
// Copyright (c) 2013- PPSSPP Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0 or later versions.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official git repository and contact information can be found at
|
||||
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
||||
|
||||
#include "GPU/Common/DrawEngineCommon.h"
|
||||
|
||||
// Copyright (c) 2013- PPSSPP Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0 or later versions.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official git repository and contact information can be found at
|
||||
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
||||
|
||||
#include "GPU/Common/DrawEngineCommon.h"
|
||||
#include "GPU/Common/SplineCommon.h"
|
||||
#include "GPU/ge_constants.h"
|
||||
#include "GPU/GPUState.h"
|
||||
|
||||
DrawEngineCommon::~DrawEngineCommon() { }
|
||||
|
||||
struct Plane {
|
||||
float x, y, z, w;
|
||||
void Set(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; }
|
||||
float Test(float f[3]) const { return x * f[0] + y * f[1] + z * f[2] + w; }
|
||||
};
|
||||
|
||||
static void PlanesFromMatrix(float mtx[16], Plane planes[6]) {
|
||||
planes[0].Set(mtx[3]-mtx[0], mtx[7]-mtx[4], mtx[11]-mtx[8], mtx[15]-mtx[12]); // Right
|
||||
planes[1].Set(mtx[3]+mtx[0], mtx[7]+mtx[4], mtx[11]+mtx[8], mtx[15]+mtx[12]); // Left
|
||||
planes[2].Set(mtx[3]+mtx[1], mtx[7]+mtx[5], mtx[11]+mtx[9], mtx[15]+mtx[13]); // Bottom
|
||||
planes[3].Set(mtx[3]-mtx[1], mtx[7]-mtx[5], mtx[11]-mtx[9], mtx[15]-mtx[13]); // Top
|
||||
planes[4].Set(mtx[3]+mtx[2], mtx[7]+mtx[6], mtx[11]+mtx[10], mtx[15]+mtx[14]); // Near
|
||||
planes[5].Set(mtx[3]-mtx[2], mtx[7]-mtx[6], mtx[11]-mtx[10], mtx[15]-mtx[14]); // Far
|
||||
}
|
||||
|
||||
// This code is HIGHLY unoptimized!
|
||||
//
|
||||
// It does the simplest and safest test possible: If all points of a bbox is outside a single of
|
||||
// our clipping planes, we reject the box. Tighter bounds would be desirable but would take more calculations.
|
||||
bool DrawEngineCommon::TestBoundingBox(void* control_points, int vertexCount, u32 vertType) {
|
||||
SimpleVertex *corners = (SimpleVertex *)(decoded + 65536 * 12);
|
||||
float *verts = (float *)(decoded + 65536 * 18);
|
||||
|
||||
// Try to skip NormalizeVertices if it's pure positions. No need to bother with a vertex decoder
|
||||
// and a large vertex format.
|
||||
if ((vertType & 0xFFFFFF) == GE_VTYPE_POS_FLOAT) {
|
||||
// memcpy(verts, control_points, 12 * vertexCount);
|
||||
verts = (float *)control_points;
|
||||
} else if ((vertType & 0xFFFFFF) == GE_VTYPE_POS_8BIT) {
|
||||
const s8 *vtx = (const s8 *)control_points;
|
||||
for (int i = 0; i < vertexCount * 3; i++) {
|
||||
verts[i] = vtx[i] * (1.0f / 128.0f);
|
||||
}
|
||||
} else if ((vertType & 0xFFFFFF) == GE_VTYPE_POS_16BIT) {
|
||||
const s16 *vtx = (const s16*)control_points;
|
||||
for (int i = 0; i < vertexCount * 3; i++) {
|
||||
verts[i] = vtx[i] * (1.0f / 32768.0f);
|
||||
}
|
||||
} else {
|
||||
// Simplify away bones and morph before proceeding
|
||||
u8 *temp_buffer = decoded + 65536 * 24;
|
||||
NormalizeVertices((u8 *)corners, temp_buffer, (u8 *)control_points, 0, vertexCount, vertType);
|
||||
// Special case for float positions only.
|
||||
const float *ctrl = (const float *)control_points;
|
||||
for (int i = 0; i < vertexCount; i++) {
|
||||
verts[i * 3] = corners[i].pos.x;
|
||||
verts[i * 3 + 1] = corners[i].pos.y;
|
||||
verts[i * 3 + 2] = corners[i].pos.z;
|
||||
}
|
||||
}
|
||||
|
||||
Plane planes[6];
|
||||
|
||||
float world[16];
|
||||
float view[16];
|
||||
float worldview[16];
|
||||
float worldviewproj[16];
|
||||
ConvertMatrix4x3To4x4(world, gstate.worldMatrix);
|
||||
ConvertMatrix4x3To4x4(view, gstate.viewMatrix);
|
||||
Matrix4ByMatrix4(worldview, world, view);
|
||||
Matrix4ByMatrix4(worldviewproj, worldview, gstate.projMatrix);
|
||||
PlanesFromMatrix(worldviewproj, planes);
|
||||
for (int plane = 0; plane < 6; plane++) {
|
||||
int inside = 0;
|
||||
int out = 0;
|
||||
for (int i = 0; i < vertexCount; i++) {
|
||||
// Here we can test against the frustum planes!
|
||||
float value = planes[plane].Test(verts + i * 3);
|
||||
if (value < 0)
|
||||
out++;
|
||||
else
|
||||
inside++;
|
||||
}
|
||||
|
||||
if (inside == 0) {
|
||||
// All out
|
||||
return false;
|
||||
}
|
||||
|
||||
// Any out. For testing that the planes are in the right locations.
|
||||
// if (out != 0) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1,24 +1,35 @@
|
|||
// Copyright (c) 2013- PPSSPP Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0 or later versions.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official git repository and contact information can be found at
|
||||
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
||||
// Copyright (c) 2013- PPSSPP Project.
|
||||
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, version 2.0 or later versions.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License 2.0 for more details.
|
||||
|
||||
// A copy of the GPL 2.0 should have been included with the program.
|
||||
// If not, see http://www.gnu.org/licenses/
|
||||
|
||||
// Official git repository and contact information can be found at
|
||||
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Common/CommonTypes.h"
|
||||
|
||||
class DrawEngineCommon {
|
||||
public:
|
||||
virtual ~DrawEngineCommon();
|
||||
|
||||
bool TestBoundingBox(void* control_points, int vertexCount, u32 vertType);
|
||||
|
||||
// TODO: This can be shared once the decoder cache / etc. are.
|
||||
virtual u32 NormalizeVertices(u8 *outPtr, u8 *bufPtr, const u8 *inPtr, int lowerBound, int upperBound, u32 vertType) = 0;
|
||||
|
||||
protected:
|
||||
// Vertex collector buffers
|
||||
u8 *decoded;
|
||||
u16 *decIndex;
|
||||
};
|
|
@ -314,7 +314,7 @@ static const CommandTableEntry commandTable[] = {
|
|||
{GE_CMD_VADDR, FLAG_EXECUTE, &DIRECTX9_GPU::Execute_Vaddr},
|
||||
{GE_CMD_IADDR, FLAG_EXECUTE, &DIRECTX9_GPU::Execute_Iaddr},
|
||||
{GE_CMD_BJUMP, FLAG_EXECUTE | FLAG_READS_PC | FLAG_WRITES_PC}, // EXECUTE
|
||||
{GE_CMD_BOUNDINGBOX, FLAG_EXECUTE}, // + FLUSHBEFORE when we implement
|
||||
{GE_CMD_BOUNDINGBOX, FLAG_EXECUTE, &DIRECTX9_GPU::Execute_BoundingBox}, // + FLUSHBEFORE when we implement... or not, do we need to?
|
||||
|
||||
// Changing the vertex type requires us to flush.
|
||||
{GE_CMD_VERTEXTYPE, FLAG_FLUSHBEFOREONCHANGE | FLAG_EXECUTEONCHANGE, &DIRECTX9_GPU::Execute_VertexType},
|
||||
|
@ -868,6 +868,32 @@ void DIRECTX9_GPU::Execute_ViewportType(u32 op, u32 diff) {
|
|||
}
|
||||
}
|
||||
|
||||
void DIRECTX9_GPU::Execute_BoundingBox(u32 op, u32 diff) {
|
||||
// Just resetting, nothing to bound.
|
||||
const u32 data = op & 0x00FFFFFF;
|
||||
if (data == 0) {
|
||||
// TODO: Should this set the bboxResult? Let's set it true for now.
|
||||
currentList->bboxResult = true;
|
||||
return;
|
||||
}
|
||||
if (((data & 7) == 0) && data <= 64) { // Sanity check
|
||||
void *control_points = Memory::GetPointer(gstate_c.vertexAddr);
|
||||
if (gstate.vertType & GE_VTYPE_IDX_MASK) {
|
||||
ERROR_LOG_REPORT_ONCE(boundingbox, G3D, "Indexed bounding box data not supported.");
|
||||
// Data seems invalid. Let's assume the box test passed.
|
||||
currentList->bboxResult = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// Test if the bounding box is within the drawing region.
|
||||
currentList->bboxResult = transformDraw_.TestBoundingBox(control_points, data, gstate.vertType);
|
||||
} else {
|
||||
ERROR_LOG_REPORT_ONCE(boundingbox, G3D, "Bad bounding box data: %06x", data);
|
||||
// Data seems invalid. Let's assume the box test passed.
|
||||
currentList->bboxResult = true;
|
||||
}
|
||||
}
|
||||
|
||||
void DIRECTX9_GPU::Execute_Region(u32 op, u32 diff) {
|
||||
gstate_c.framebufChanged = true;
|
||||
gstate_c.textureChanged |= TEXCHANGE_PARAMSONLY;
|
||||
|
@ -1285,28 +1311,7 @@ void DIRECTX9_GPU::Execute_Generic(u32 op, u32 diff) {
|
|||
break;
|
||||
|
||||
case GE_CMD_BOUNDINGBOX:
|
||||
// Just resetting, nothing to bound.
|
||||
if (data == 0) {
|
||||
// TODO: Should this set the bboxResult? Let's set it true for now.
|
||||
currentList->bboxResult = true;
|
||||
break;
|
||||
}
|
||||
if ((data % 8 == 0) && data < 64) { // Sanity check
|
||||
void *control_points = Memory::GetPointer(gstate_c.vertexAddr);
|
||||
if (gstate.vertType & GE_VTYPE_IDX_MASK) {
|
||||
ERROR_LOG_REPORT_ONCE(boundingbox, G3D, "Indexed bounding box data not supported.");
|
||||
// Data seems invalid. Let's assume the box test passed.
|
||||
currentList->bboxResult = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Test if the bounding box is within the drawing region.
|
||||
currentList->bboxResult = transformDraw_.TestBoundingBox(control_points, data, gstate.vertType);
|
||||
} else {
|
||||
ERROR_LOG_REPORT_ONCE(boundingbox, G3D, "Bad bounding box data: %06x", data);
|
||||
// Data seems invalid. Let's assume the box test passed.
|
||||
currentList->bboxResult = true;
|
||||
}
|
||||
Execute_BoundingBox(op, diff);
|
||||
break;
|
||||
|
||||
case GE_CMD_REGION1:
|
||||
|
|
|
@ -90,6 +90,7 @@ public:
|
|||
void Execute_Prim(u32 op, u32 diff);
|
||||
void Execute_Bezier(u32 op, u32 diff);
|
||||
void Execute_Spline(u32 op, u32 diff);
|
||||
void Execute_BoundingBox(u32 op, u32 diff);
|
||||
void Execute_VertexType(u32 op, u32 diff);
|
||||
void Execute_VertexTypeSkinning(u32 op, u32 diff);
|
||||
void Execute_Region(u32 op, u32 diff);
|
||||
|
|
|
@ -945,54 +945,16 @@ void TransformDrawEngineDX9::Resized() {
|
|||
}
|
||||
decoderMap_.clear();
|
||||
|
||||
// ...
|
||||
if (g_Config.bPrescaleUV && !uvScale) {
|
||||
uvScale = new UVScale[MAX_DEFERRED_DRAW_CALLS];
|
||||
} else if (!g_Config.bPrescaleUV && uvScale) {
|
||||
delete uvScale;
|
||||
uvScale = 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool TransformDrawEngineDX9::TestBoundingBox(void* control_points, int vertexCount, u32 vertType) {
|
||||
// Simplify away bones and morph before proceeding
|
||||
|
||||
/*
|
||||
SimpleVertex *corners = (SimpleVertex *)(decoded + 65536 * 12);
|
||||
u8 *temp_buffer = decoded + 65536 * 24;
|
||||
|
||||
u32 origVertType = vertType;
|
||||
vertType = NormalizeVertices((u8 *)corners, temp_buffer, (u8 *)control_points, 0, vertexCount, vertType);
|
||||
|
||||
for (int cube = 0; cube < vertexCount / 8; cube++) {
|
||||
// For each cube...
|
||||
|
||||
for (int i = 0; i < 8; i++) {
|
||||
const SimpleVertex &vert = corners[cube * 8 + i];
|
||||
|
||||
// To world space...
|
||||
float worldPos[3];
|
||||
Vec3ByMatrix43(worldPos, (float *)&vert.pos.x, gstate.worldMatrix);
|
||||
|
||||
// To view space...
|
||||
float viewPos[3];
|
||||
Vec3ByMatrix43(viewPos, worldPos, gstate.viewMatrix);
|
||||
|
||||
// And finally to screen space.
|
||||
float frustumPos[4];
|
||||
Vec3ByMatrix44(frustumPos, viewPos, gstate.projMatrix);
|
||||
|
||||
// Project to 2D
|
||||
float x = frustumPos[0] / frustumPos[3];
|
||||
float y = frustumPos[1] / frustumPos[3];
|
||||
|
||||
// Rescale 2d position
|
||||
// ...
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
// Let's think. A better approach might be to take the edges of the drawing region and the projection
|
||||
// matrix to build a frustum pyramid, and then clip the cube against those planes. If all vertices fail the same test,
|
||||
// the cube is out. Otherwise it's in.
|
||||
// TODO....
|
||||
|
||||
return true;
|
||||
bool TransformDrawEngineDX9::IsCodePtrVertexDecoder(const u8 *ptr) const {
|
||||
return decJitCache_->IsInSpace(ptr);
|
||||
}
|
||||
|
||||
// TODO: Probably move this to common code (with normalization?)
|
||||
|
@ -1022,10 +984,6 @@ static Vec3f ScreenToDrawing(const Vec3f& coords) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
bool TransformDrawEngineDX9::IsCodePtrVertexDecoder(const u8 *ptr) const {
|
||||
return decJitCache_->IsInSpace(ptr);
|
||||
}
|
||||
|
||||
// TODO: This probably is not the best interface.
|
||||
bool TransformDrawEngineDX9::GetCurrentSimpleVertices(int count, std::vector<GPUDebugVertex> &vertices, std::vector<u16> &indices) {
|
||||
// This is always for the current vertices.
|
||||
|
|
|
@ -112,7 +112,6 @@ public:
|
|||
void SubmitPrim(void *verts, void *inds, GEPrimitiveType prim, int vertexCount, u32 vertType, int *bytesRead);
|
||||
void SubmitSpline(void* control_points, void* indices, int count_u, int count_v, int type_u, int type_v, GEPatchPrimType prim_type, u32 vertType);
|
||||
void SubmitBezier(void* control_points, void* indices, int count_u, int count_v, GEPatchPrimType prim_type, u32 vertType);
|
||||
bool TestBoundingBox(void* control_points, int vertexCount, u32 vertType);
|
||||
|
||||
bool GetCurrentSimpleVertices(int count, std::vector<GPUDebugVertex> &vertices, std::vector<u16> &indices);
|
||||
|
||||
|
@ -148,6 +147,10 @@ public:
|
|||
DoFlush();
|
||||
}
|
||||
|
||||
protected:
|
||||
// Preprocessing for spline/bezier
|
||||
virtual u32 NormalizeVertices(u8 *outPtr, u8 *bufPtr, const u8 *inPtr, int lowerBound, int upperBound, u32 vertType) override;
|
||||
|
||||
private:
|
||||
void DecodeVerts();
|
||||
void DecodeVertsStep();
|
||||
|
@ -161,7 +164,6 @@ private:
|
|||
|
||||
// Preprocessing for spline/bezier
|
||||
u32 NormalizeVertices(u8 *outPtr, u8 *bufPtr, const u8 *inPtr, VertexDecoder *dec, int lowerBound, int upperBound, u32 vertType);
|
||||
u32 NormalizeVertices(u8 *outPtr, u8 *bufPtr, const u8 *inPtr, int lowerBound, int upperBound, u32 vertType);
|
||||
|
||||
u32 ComputeMiniHash();
|
||||
u32 ComputeHash(); // Reads deferred vertex data.
|
||||
|
|
|
@ -935,92 +935,6 @@ void TransformDrawEngine::Resized() {
|
|||
}
|
||||
}
|
||||
|
||||
struct Plane {
|
||||
float x, y, z, w;
|
||||
void Set(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; }
|
||||
float Test(float f[3]) const { return x * f[0] + y * f[1] + z * f[2] + w; }
|
||||
};
|
||||
|
||||
static void PlanesFromMatrix(float mtx[16], Plane planes[6]) {
|
||||
planes[0].Set(mtx[3]-mtx[0], mtx[7]-mtx[4], mtx[11]-mtx[8], mtx[15]-mtx[12]); // Right
|
||||
planes[1].Set(mtx[3]+mtx[0], mtx[7]+mtx[4], mtx[11]+mtx[8], mtx[15]+mtx[12]); // Left
|
||||
planes[2].Set(mtx[3]+mtx[1], mtx[7]+mtx[5], mtx[11]+mtx[9], mtx[15]+mtx[13]); // Bottom
|
||||
planes[3].Set(mtx[3]-mtx[1], mtx[7]-mtx[5], mtx[11]-mtx[9], mtx[15]-mtx[13]); // Top
|
||||
planes[4].Set(mtx[3]+mtx[2], mtx[7]+mtx[6], mtx[11]+mtx[10], mtx[15]+mtx[14]); // Near
|
||||
planes[5].Set(mtx[3]-mtx[2], mtx[7]-mtx[6], mtx[11]-mtx[10], mtx[15]-mtx[14]); // Far
|
||||
}
|
||||
|
||||
// This code is HIGHLY unoptimized!
|
||||
//
|
||||
// It does the simplest and safest test possible: If all points of a bbox is outside a single of
|
||||
// our clipping planes, we reject the box. Tighter bounds would be desirable but would take more calculations.
|
||||
bool TransformDrawEngine::TestBoundingBox(void* control_points, int vertexCount, u32 vertType) {
|
||||
SimpleVertex *corners = (SimpleVertex *)(decoded + 65536 * 12);
|
||||
float *verts = (float *)(decoded + 65536 * 18);
|
||||
|
||||
// Try to skip NormalizeVertices if it's pure positions. No need to bother with a vertex decoder
|
||||
// and a large vertex format.
|
||||
if ((vertType & 0xFFFFFF) == GE_VTYPE_POS_FLOAT) {
|
||||
// memcpy(verts, control_points, 12 * vertexCount);
|
||||
verts = (float *)control_points;
|
||||
} else if ((vertType & 0xFFFFFF) == GE_VTYPE_POS_8BIT) {
|
||||
const s8 *vtx = (const s8 *)control_points;
|
||||
for (int i = 0; i < vertexCount * 3; i++) {
|
||||
verts[i] = vtx[i] * (1.0f / 128.0f);
|
||||
}
|
||||
} else if ((vertType & 0xFFFFFF) == GE_VTYPE_POS_16BIT) {
|
||||
const s16 *vtx = (const s16*)control_points;
|
||||
for (int i = 0; i < vertexCount * 3; i++) {
|
||||
verts[i] = vtx[i] * (1.0f / 32768.0f);
|
||||
}
|
||||
} else {
|
||||
// Simplify away bones and morph before proceeding
|
||||
u8 *temp_buffer = decoded + 65536 * 24;
|
||||
NormalizeVertices((u8 *)corners, temp_buffer, (u8 *)control_points, 0, vertexCount, vertType);
|
||||
// Special case for float positions only.
|
||||
const float *ctrl = (const float *)control_points;
|
||||
for (int i = 0; i < vertexCount; i++) {
|
||||
verts[i * 3] = corners[i].pos.x;
|
||||
verts[i * 3 + 1] = corners[i].pos.y;
|
||||
verts[i * 3 + 2] = corners[i].pos.z;
|
||||
}
|
||||
}
|
||||
|
||||
Plane planes[6];
|
||||
|
||||
float world[16];
|
||||
float view[16];
|
||||
float worldview[16];
|
||||
float worldviewproj[16];
|
||||
ConvertMatrix4x3To4x4(world, gstate.worldMatrix);
|
||||
ConvertMatrix4x3To4x4(view, gstate.viewMatrix);
|
||||
Matrix4ByMatrix4(worldview, world, view);
|
||||
Matrix4ByMatrix4(worldviewproj, worldview, gstate.projMatrix);
|
||||
PlanesFromMatrix(worldviewproj, planes);
|
||||
for (int plane = 0; plane < 6; plane++) {
|
||||
int inside = 0;
|
||||
int out = 0;
|
||||
for (int i = 0; i < vertexCount; i++) {
|
||||
// Here we can test against the frustum planes!
|
||||
float value = planes[plane].Test(verts + i * 3);
|
||||
if (value < 0)
|
||||
out++;
|
||||
else
|
||||
inside++;
|
||||
}
|
||||
|
||||
if (inside == 0) {
|
||||
// All out
|
||||
return false;
|
||||
}
|
||||
|
||||
// Any out. For testing that the planes are in the right locations.
|
||||
// if (out != 0) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool TransformDrawEngine::IsCodePtrVertexDecoder(const u8 *ptr) const {
|
||||
return decJitCache_->IsInSpace(ptr);
|
||||
}
|
||||
|
|
|
@ -108,7 +108,6 @@ public:
|
|||
void SubmitPrim(void *verts, void *inds, GEPrimitiveType prim, int vertexCount, u32 vertType, int *bytesRead);
|
||||
void SubmitSpline(void* control_points, void* indices, int count_u, int count_v, int type_u, int type_v, GEPatchPrimType prim_type, u32 vertType);
|
||||
void SubmitBezier(void* control_points, void* indices, int count_u, int count_v, GEPatchPrimType prim_type, u32 vertType);
|
||||
bool TestBoundingBox(void* control_points, int vertexCount, u32 vertType);
|
||||
|
||||
bool GetCurrentSimpleVertices(int count, std::vector<GPUDebugVertex> &vertices, std::vector<u16> &indices);
|
||||
|
||||
|
@ -177,6 +176,10 @@ public:
|
|||
// Really just for convenience to share with softgpu.
|
||||
static u32 NormalizeVertices(u8 *outPtr, u8 *bufPtr, const u8 *inPtr, VertexDecoder *dec, int lowerBound, int upperBound, u32 vertType);
|
||||
|
||||
protected:
|
||||
// Preprocessing for spline/bezier
|
||||
virtual u32 NormalizeVertices(u8 *outPtr, u8 *bufPtr, const u8 *inPtr, int lowerBound, int upperBound, u32 vertType) override;
|
||||
|
||||
private:
|
||||
void DecodeVerts();
|
||||
void DecodeVertsStep();
|
||||
|
@ -190,9 +193,6 @@ private:
|
|||
GLuint AllocateBuffer();
|
||||
void FreeBuffer(GLuint buf);
|
||||
|
||||
// Preprocessing for spline/bezier
|
||||
u32 NormalizeVertices(u8 *outPtr, u8 *bufPtr, const u8 *inPtr, int lowerBound, int upperBound, u32 vertType);
|
||||
|
||||
u32 ComputeMiniHash();
|
||||
u32 ComputeHash(); // Reads deferred vertex data.
|
||||
void MarkUnreliable(VertexArrayInfo *vai);
|
||||
|
@ -222,10 +222,6 @@ private:
|
|||
VertexDecoder *dec_;
|
||||
VertexDecoderJitCache *decJitCache_;
|
||||
u32 lastVType_;
|
||||
|
||||
// Vertex collector buffers
|
||||
u8 *decoded;
|
||||
u16 *decIndex;
|
||||
|
||||
TransformedVertex *transformed;
|
||||
TransformedVertex *transformedExpanded;
|
||||
|
|
Loading…
Add table
Reference in a new issue