mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-02 02:52:30 +02:00
613781c765
Based on the feedback from pull request #1767 I have put in most of degasus's suggestions in here now. I think we have a real winner here as moving the code to VertexManagerBase for a function has allowed OGL to utilize zfreeze now :) Correct use of the vertex pointer has also corrected most of the issue found in pull request #1767 that JMC47 stated. Which also for me now has Mario Tennis working with no polygon spikes on the characters anymore! Shadows are still an issue and probably in the other games with shadow problems. Rebel Strike also seems better but random skybox glitches can show up.
70 lines
1.7 KiB
C++
70 lines
1.7 KiB
C++
#pragma once
|
|
|
|
#include <vector>
|
|
#include "Common/CommonFuncs.h"
|
|
#include "Common/CommonTypes.h"
|
|
#include "VideoCommon/DataReader.h"
|
|
|
|
class NativeVertexFormat;
|
|
class PointerWrap;
|
|
|
|
enum PrimitiveType {
|
|
PRIMITIVE_POINTS,
|
|
PRIMITIVE_LINES,
|
|
PRIMITIVE_TRIANGLES,
|
|
};
|
|
|
|
class VertexManager
|
|
{
|
|
private:
|
|
static const u32 SMALLEST_POSSIBLE_VERTEX = sizeof(float)*3; // 3 pos
|
|
static const u32 LARGEST_POSSIBLE_VERTEX = sizeof(float)*45 + sizeof(u32)*2; // 3 pos, 3*3 normal, 2*u32 color, 8*4 tex, 1 posMat
|
|
|
|
static const u32 MAX_PRIMITIVES_PER_COMMAND = (u16)-1;
|
|
|
|
public:
|
|
static const u32 MAXVBUFFERSIZE = ROUND_UP_POW2 (MAX_PRIMITIVES_PER_COMMAND * LARGEST_POSSIBLE_VERTEX);
|
|
|
|
// We may convert triangle-fans to triangle-lists, almost 3x as many indices.
|
|
static const u32 MAXIBUFFERSIZE = ROUND_UP_POW2 (MAX_PRIMITIVES_PER_COMMAND * 3);
|
|
|
|
VertexManager();
|
|
// needs to be virtual for DX11's dtor
|
|
virtual ~VertexManager();
|
|
|
|
static DataReader PrepareForAdditionalData(int primitive, u32 count, u32 stride);
|
|
static void FlushData(u32 count, u32 stride);
|
|
|
|
static void Flush();
|
|
|
|
virtual ::NativeVertexFormat* CreateNativeVertexFormat() = 0;
|
|
|
|
static void DoState(PointerWrap& p);
|
|
|
|
static void CalculateZSlope(u32 stride);
|
|
|
|
protected:
|
|
virtual void vDoState(PointerWrap& p) { }
|
|
|
|
static PrimitiveType current_primitive_type;
|
|
|
|
virtual void ResetBuffer(u32 stride) = 0;
|
|
|
|
static u8* s_pCurBufferPointer;
|
|
static u8* s_pBaseBufferPointer;
|
|
static u8* s_pEndBufferPointer;
|
|
|
|
static u32 GetRemainingSize();
|
|
static u32 GetRemainingIndices(int primitive);
|
|
|
|
private:
|
|
static bool IsFlushed;
|
|
|
|
virtual void vFlush(bool useDstAlpha) = 0;
|
|
|
|
virtual void CreateDeviceObjects() {}
|
|
virtual void DestroyDeviceObjects() {}
|
|
};
|
|
|
|
extern VertexManager *g_vertex_manager;
|