dynpip files

This commit is contained in:
h4570
2022-07-18 22:42:14 +02:00
parent 95c01afa01
commit a5e1a28164
38 changed files with 481 additions and 182 deletions
@@ -0,0 +1,37 @@
/*
# ______ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licenced under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "renderer/3d/pipeline/dynamic/dynpip_programs_repository.hpp"
namespace Tyra {
DynPipProgramsRepository::DynPipProgramsRepository() {}
DynPipProgramsRepository::~DynPipProgramsRepository() {}
DynPipVU1Program* DynPipProgramsRepository::getProgram(
const DynPipProgramName& name) {
switch (name) {
case DynPipProgramName::DynPipColor:
return &color;
case DynPipProgramName::DynPipDirLights:
return &dirLights;
case DynPipProgramName::DynPipTextureDirLights:
return &textureDirLights;
case DynPipProgramName::DynPipTextureColor:
return &textureColor;
default:
TYRA_TRAP("Unknown VU1 program name");
return &color;
}
}
} // namespace Tyra
@@ -0,0 +1,21 @@
/*
# ______ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licenced under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "renderer/3d/pipeline/dynamic/dynpip_qbuffer.hpp"
#include <sstream>
#include <iomanip>
namespace Tyra {
DynPipQBuffer::DynPipQBuffer() {}
DynPipQBuffer::~DynPipQBuffer() {}
} // namespace Tyra
@@ -0,0 +1,86 @@
/*
# ______ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licenced under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "renderer/3d/pipeline/dynamic/dynpip_vu1_program.hpp"
namespace Tyra {
DynPipVU1Program::DynPipVU1Program(const DynPipProgramName& t_name,
u32* t_start, u32* t_end,
const u32& t_reglist,
const u8& t_reglistCount,
const u8& t_elementsPerVertex)
: VU1Program(t_start, t_end),
name(t_name),
reglistCount(t_reglistCount),
elementsPerVertex(t_elementsPerVertex),
reglist(t_reglist) {
packetSize = packet2_utils_get_packet_size_for_program(start, end);
programSize = calculateProgramSize();
}
DynPipVU1Program::~DynPipVU1Program() {}
const DynPipProgramName& DynPipVU1Program::getName() const { return name; }
u32& DynPipVU1Program::getReglist() { return reglist; }
void DynPipVU1Program::addBufferDataToPacket(packet2_t* packet,
DynPipQBuffer* buffer,
prim_t* prim) {
addStandardBufferDataToPacket(packet, buffer, prim);
addProgramQBufferDataToPacket(packet, buffer);
}
void DynPipVU1Program::addStandardBufferDataToPacket(packet2_t* packet,
DynPipQBuffer* buffer,
prim_t* prim) {
// if (buffer->bag->texture)
// prim->mapping = 1;
// else
// prim->mapping = 0;
// packet2_utils_vu_open_unpack(packet, 0, true);
// {
// packet2_add_float(packet, 2048.0F); // scale
// packet2_add_float(packet, 2048.0F); // scale
// packet2_add_float(packet,
// static_cast<float>(0xFFFFFF) / 32.0F); // scale
// packet2_add_u32(packet, buffer->size); // vertex count
// packet2_utils_gs_add_prim_giftag(packet, prim, buffer->size, reglist,
// reglistCount, 0);
// }
// packet2_utils_vu_close_unpack(packet);
}
u16 DynPipVU1Program::getMaxVertCount(const bool& singleColorEnabled,
const u16& bufferSize) const {
return 0; // TODO
// u16 res = bufferSize - 4;
// u8 colorElementsPerVertex =
// singleColorEnabled ? (elementsPerVertex - 1) : elementsPerVertex;
// res /= (colorElementsPerVertex + reglistCount);
// // Buffer size = VU1 double buffer size (xtop)
// // res = qbuffer size (directly inside VU1)
// // Must be dividable by 3 and the result also dividable by 3. Why?
// // 1st dividable reason - triangle, and packaging system in 3d rendering
// // 2nd dividable reason - subpackaging system. We are splitting packages
// into
// // 3 subpackages in 3d renderer.
// res = res / 3 / 3;
// res = res * 3 * 3;
// return res;
}
} // namespace Tyra
@@ -21,7 +21,7 @@
.init_vf_all
.init_vi_all
#include "src/renderer/core/paths/path1/programs/vcl_sml.i"
#include "src/renderer/3d/pipeline/shared_macros/vcl_sml.i"
#include "inc/renderer/3d/pipeline/minecraft/programs/as_is/mcpip_vu1_as_is_shared_defines.h"
#include "src/renderer/3d/pipeline/minecraft/programs/as_is/macros.i"
@@ -57,15 +57,15 @@ void McpipClip::initStaticPacket() {
void McpipClip::addData(McpipBlock* block, const bool& isMulti,
RendererCoreTextureBuffers* texBuffers,
packet2_t* packet, const u8& context) {
std::vector<Path1ClipVertex> clippedVertices;
std::vector<EEClipVertex> clippedVertices;
auto mvp = rendererCore->renderer3D.getViewProj() * block->model;
const auto* blockData = isMulti ? multiBlockData : singleBlockData;
for (u32 i = 0; i < blockData->count / 3; i++) {
for (u8 j = 0; j < 3; j++) {
Path1ClipVertex vert = {mvp * blockData->vertices[i * 3 + j], Vec4(),
blockData->textureCoords[i * 3 + j], Vec4()};
EEClipVertex vert = {mvp * blockData->vertices[i * 3 + j], Vec4(),
blockData->textureCoords[i * 3 + j], Vec4()};
inputTriangle.push_back(vert);
}
@@ -93,7 +93,7 @@ void McpipClip::addData(McpipBlock* block, const bool& isMulti,
addDataToPacket(packet, context, block, clippedVertices.size(), texBuffers);
}
void McpipClip::addCorrections(std::vector<Path1ClipVertex>* vertices,
void McpipClip::addCorrections(std::vector<EEClipVertex>* vertices,
McpipBlock* block) {
for (u32 i = 0; i < vertices->size(); i++) {
(*vertices)[i].position /= (*vertices)[i].position.w; // Perspective divide
@@ -101,7 +101,7 @@ void McpipClip::addCorrections(std::vector<Path1ClipVertex>* vertices,
}
}
void McpipClip::moveDataToBuffer(std::vector<Path1ClipVertex>* vertices,
void McpipClip::moveDataToBuffer(std::vector<EEClipVertex>* vertices,
const u8& context) {
for (u32 i = 0; i < vertices->size(); i++) {
vertexBuffers[context][i].set(vertices->at(i).position);
@@ -21,7 +21,7 @@
.init_vf_all
.init_vi_all
#include "src/renderer/core/paths/path1/programs/vcl_sml.i"
#include "src/renderer/3d/pipeline/shared_macros/vcl_sml.i"
#include "inc/renderer/3d/pipeline/minecraft/programs/cull/mcpip_vu1_cull_shared_defines.h"
#include "src/renderer/3d/pipeline/minecraft/programs/cull/macros.i"
@@ -18,8 +18,8 @@
.init_vf_all
.init_vi_all
#include "src/renderer/core/paths/path1/programs/vcl_sml.i"
#include "src/renderer/core/paths/path1/programs/tyra_macros.i"
#include "src/renderer/3d/pipeline/shared_macros/vcl_sml.i"
#include "src/renderer/3d/pipeline/shared_macros/tyra_macros.i"
#include "inc/renderer/3d/pipeline/static/core/programs/stapip_vu1_shared_defines.h"
#define RGBA_STORE_OFFSET 0
@@ -18,8 +18,8 @@
.init_vf_all
.init_vi_all
#include "src/renderer/core/paths/path1/programs/vcl_sml.i"
#include "src/renderer/core/paths/path1/programs/tyra_macros.i"
#include "src/renderer/3d/pipeline/shared_macros/vcl_sml.i"
#include "src/renderer/3d/pipeline/shared_macros/tyra_macros.i"
#include "inc/renderer/3d/pipeline/static/core/programs/stapip_vu1_shared_defines.h"
#define RGBA_STORE_OFFSET 0
@@ -18,8 +18,8 @@
.init_vf_all
.init_vi_all
#include "src/renderer/core/paths/path1/programs/vcl_sml.i"
#include "src/renderer/core/paths/path1/programs/tyra_macros.i"
#include "src/renderer/3d/pipeline/shared_macros/vcl_sml.i"
#include "src/renderer/3d/pipeline/shared_macros/tyra_macros.i"
#include "inc/renderer/3d/pipeline/static/core/programs/stapip_vu1_shared_defines.h"
#define STQ_STORE_OFFSET 0
@@ -18,8 +18,8 @@
.init_vf_all
.init_vi_all
#include "src/renderer/core/paths/path1/programs/vcl_sml.i"
#include "src/renderer/core/paths/path1/programs/tyra_macros.i"
#include "src/renderer/3d/pipeline/shared_macros/vcl_sml.i"
#include "src/renderer/3d/pipeline/shared_macros/tyra_macros.i"
#include "inc/renderer/3d/pipeline/static/core/programs/stapip_vu1_shared_defines.h"
#define STQ_STORE_OFFSET 0
@@ -18,8 +18,8 @@
.init_vf_all
.init_vi_all
#include "src/renderer/core/paths/path1/programs/vcl_sml.i"
#include "src/renderer/core/paths/path1/programs/tyra_macros.i"
#include "src/renderer/3d/pipeline/shared_macros/vcl_sml.i"
#include "src/renderer/3d/pipeline/shared_macros/tyra_macros.i"
#include "inc/renderer/3d/pipeline/static/core/programs/stapip_vu1_shared_defines.h"
#define RGBA_STORE_OFFSET 0
@@ -18,8 +18,8 @@
.init_vf_all
.init_vi_all
#include "src/renderer/core/paths/path1/programs/vcl_sml.i"
#include "src/renderer/core/paths/path1/programs/tyra_macros.i"
#include "src/renderer/3d/pipeline/shared_macros/vcl_sml.i"
#include "src/renderer/3d/pipeline/shared_macros/tyra_macros.i"
#include "inc/renderer/3d/pipeline/static/core/programs/stapip_vu1_shared_defines.h"
#define RGBA_STORE_OFFSET 0
@@ -18,8 +18,8 @@
.init_vf_all
.init_vi_all
#include "src/renderer/core/paths/path1/programs/vcl_sml.i"
#include "src/renderer/core/paths/path1/programs/tyra_macros.i"
#include "src/renderer/3d/pipeline/shared_macros/vcl_sml.i"
#include "src/renderer/3d/pipeline/shared_macros/tyra_macros.i"
#include "inc/renderer/3d/pipeline/static/core/programs/stapip_vu1_shared_defines.h"
#define STQ_STORE_OFFSET 0
@@ -18,8 +18,8 @@
.init_vf_all
.init_vi_all
#include "src/renderer/core/paths/path1/programs/vcl_sml.i"
#include "src/renderer/core/paths/path1/programs/tyra_macros.i"
#include "src/renderer/3d/pipeline/shared_macros/vcl_sml.i"
#include "src/renderer/3d/pipeline/shared_macros/tyra_macros.i"
#include "inc/renderer/3d/pipeline/static/core/programs/stapip_vu1_shared_defines.h"
#define STQ_STORE_OFFSET 0
@@ -27,16 +27,16 @@ void StaPipClipper::clip(StaPipQBuffer* buffer) {
TYRA_ASSERT(buffer->size <= maxVertCount / 3, "Buffer should have max ",
maxVertCount / 3, " verts if we want to clip it.");
Path1EEClipAlgorithmSettings algoSettings = {
buffer->bag->lighting != nullptr, buffer->bag->texture != nullptr,
buffer->bag->color->many != nullptr};
EEClipAlgorithmSettings algoSettings = {buffer->bag->lighting != nullptr,
buffer->bag->texture != nullptr,
buffer->bag->color->many != nullptr};
std::vector<Path1ClipVertex> clippedVertices;
std::vector<EEClipVertex> clippedVertices;
for (u32 i = 0; i < buffer->size / 3; i++) {
std::vector<Path1ClipVertex> inputTriangle;
std::vector<EEClipVertex> inputTriangle;
for (u8 j = 0; j < 3; j++) {
Path1ClipVertex vert = {
EEClipVertex vert = {
*mvp * buffer->vertices[i * 3 + j],
buffer->bag->lighting ? buffer->normals[i * 3 + j] : Vec4(),
buffer->bag->texture ? buffer->sts[i * 3 + j] : Vec4(),
@@ -45,7 +45,7 @@ void StaPipClipper::clip(StaPipQBuffer* buffer) {
inputTriangle.push_back(vert);
}
std::vector<Path1ClipVertex> clippedTriangle;
std::vector<EEClipVertex> clippedTriangle;
algorithm.clip(&clippedTriangle, inputTriangle, algoSettings);
if (clippedTriangle.size() == 0) continue;
@@ -64,14 +64,14 @@ void StaPipClipper::clip(StaPipQBuffer* buffer) {
moveDataToBuffer(clippedVertices, buffer);
}
void StaPipClipper::perspectiveDivide(std::vector<Path1ClipVertex>* vertices) {
void StaPipClipper::perspectiveDivide(std::vector<EEClipVertex>* vertices) {
for (u32 i = 0; i < vertices->size(); i++) {
(*vertices)[i].position /= (*vertices)[i].position.w;
}
}
void StaPipClipper::moveDataToBuffer(
const std::vector<Path1ClipVertex>& vertices, StaPipQBuffer* buffer) {
void StaPipClipper::moveDataToBuffer(const std::vector<EEClipVertex>& vertices,
StaPipQBuffer* buffer) {
buffer->reallocateManually(vertices.size());
for (u32 i = 0; i < vertices.size(); i++) {
@@ -25,14 +25,14 @@ StaPipVU1Program* StaPipProgramsRepository::getProgram(
return &cullColor;
case StaPipProgramName::StaPipAsIsDirLights:
return &asIsLightingColor;
return &asIsDirLights;
case StaPipProgramName::StaPipCullDirLights:
return &cullLightingColor;
return &cullDirLights;
case StaPipProgramName::StaPipAsIsTextureDirLights:
return &asIsLightingTextureColor;
return &asIsTextureDirLights;
case StaPipProgramName::StaPipCullTextureDirLights:
return &cullLightingTextureColor;
return &cullTextureDirLights;
case StaPipProgramName::StaPipAsIsTextureColor:
return &asIsTextureColor;
@@ -41,7 +41,7 @@ StaPipVU1Program* StaPipProgramsRepository::getProgram(
default:
TYRA_TRAP("Unknown VU1 program name");
return &cullLightingTextureColor;
return &cullTextureDirLights;
}
}
@@ -36,7 +36,7 @@ namespace Tyra {
StaPipQBufferRenderer::StaPipQBufferRenderer() {
context = 0;
lastProgramName = StdipUndefinedProgram;
lastProgramName = StaPipUndefinedProgram;
staticDataPacket = packet2_create(3, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
objectDataPacket = packet2_create(16, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
programsPacket = nullptr;
@@ -221,7 +221,7 @@ void StaPipQBufferRenderer::clip(StaPipQBuffer* buffer) {
}
void StaPipQBufferRenderer::clearLastProgramName() {
lastProgramName = StdipUndefinedProgram;
lastProgramName = StaPipUndefinedProgram;
}
void StaPipQBufferRenderer::addBufferDataToPacket(StaPipVU1Program* program,
@@ -8,26 +8,26 @@
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "renderer/core/paths/path1/clipper/path1_ee_clip_algorithm.hpp"
#include "renderer/core/3d/clipper/ee_clip_algorithm.hpp"
namespace Tyra {
Path1EEClipAlgorithm::Path1EEClipAlgorithm() {}
EEClipAlgorithm::EEClipAlgorithm() {}
Path1EEClipAlgorithm::~Path1EEClipAlgorithm() {}
EEClipAlgorithm::~EEClipAlgorithm() {}
float Path1EEClipAlgorithm::clipMargin = -10.0F;
float EEClipAlgorithm::clipMargin = -10.0F;
void Path1EEClipAlgorithm::init(const RendererSettings& settings) {
void EEClipAlgorithm::init(const RendererSettings& settings) {
halfWidth = settings.getWidth() / 2;
halfHeight = settings.getHeight() / 2;
near = settings.getNear() - (-clipMargin);
far = -settings.getFar();
}
void Path1EEClipAlgorithm::clip(std::vector<Path1ClipVertex>* o_vertices,
const std::vector<Path1ClipVertex>& vertices,
const Path1EEClipAlgorithmSettings& settings) {
void EEClipAlgorithm::clip(std::vector<EEClipVertex>* o_vertices,
const std::vector<EEClipVertex>& vertices,
const EEClipAlgorithmSettings& settings) {
tempVertices.clear();
for (u32 i = 0; i < vertices.size(); i++) {
@@ -42,8 +42,8 @@ void Path1EEClipAlgorithm::clip(std::vector<Path1ClipVertex>* o_vertices,
clipAgainstPlane(tempVertices, o_vertices, 4, far, settings);
}
float Path1EEClipAlgorithm::getValueByPlane(const Path1ClipVertex& v,
const int& plane) {
float EEClipAlgorithm::getValueByPlane(const EEClipVertex& v,
const int& plane) {
switch (plane) {
case 1:
return v.position.x; // x plane
@@ -57,9 +57,8 @@ float Path1EEClipAlgorithm::getValueByPlane(const Path1ClipVertex& v,
}
}
bool Path1EEClipAlgorithm::isInside(const int& plane, const float& v,
const float& w,
const float& planeLimitValue) {
bool EEClipAlgorithm::isInside(const int& plane, const float& v, const float& w,
const float& planeLimitValue) {
switch (plane) {
case 3:
return v <= planeLimitValue; // near z plane
@@ -71,11 +70,10 @@ bool Path1EEClipAlgorithm::isInside(const int& plane, const float& v,
}
}
void Path1EEClipAlgorithm::clipAgainstPlane(
const std::vector<Path1ClipVertex>& original,
std::vector<Path1ClipVertex>* clipped, const int& plane,
const float& planeLimitValue,
const Path1EEClipAlgorithmSettings& settings) {
void EEClipAlgorithm::clipAgainstPlane(
const std::vector<EEClipVertex>& original,
std::vector<EEClipVertex>* clipped, const int& plane,
const float& planeLimitValue, const EEClipAlgorithmSettings& settings) {
clipped->clear();
for (u32 i = 0; i < original.size(); i++) {
@@ -98,7 +96,7 @@ void Path1EEClipAlgorithm::clipAgainstPlane(
((b.position.w - a.position.w) * planeLimitValue -
(bpx - apx));
Path1ClipVertex nb = {
EEClipVertex nb = {
Vec4::getByLerp(a.position, b.position, p),
settings.lerpNormals ? Vec4::getByLerp(a.normal, b.normal, p)
: Vec4(),
@@ -1,45 +0,0 @@
; ______ ____ ___
; | \/ ____| |___|
; | | | \ | |
;---------------------------------------------------------------
; Copyright 2022, tyra - https://github.com/h4570/tyra
; Licenced under Apache License 2.0
; Sandro Sobczyński <sandro.sobczynski@gmail.com>
;
;---------------------------------------------------------------
; Needed for synchronization with draw_wait_finish()
;---------------------------------------------------------------
.syntax new
.name VU1DrawFinish
.vu
.init_vf_all
.init_vi_all
#include "src/renderer/core/paths/path1/programs/vcl_sml.i"
#include "src/renderer/core/paths/path1/programs/tyra_macros.i"
#include "inc/renderer/3d/pipeline/static/core/programs/stapip_vu1_shared_defines.h"
--enter
--endenter
#vuprog VU1DrawFinish
LoadTyraStaticData{ gifSetTag }
xtop buffer
lq drawFinishTag, 0(buffer)
lq primTag, 1(buffer)
iaddiu kickAddress, buffer, 2
sq gifSetTag, 0(kickAddress)
sq drawFinishTag, 1(kickAddress)
sq primTag, 2(kickAddress)
xgkick kickAddress
#endvuprog
--exit
--endexit
@@ -1,37 +0,0 @@
/*
# ______ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licenced under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "debug/debug.hpp"
#include "renderer/core/paths/path1/programs/draw_finish/vu1_draw_finish.hpp"
extern u32 VU1DrawFinish_CodeStart __attribute__((section(".vudata")));
extern u32 VU1DrawFinish_CodeEnd __attribute__((section(".vudata")));
namespace Tyra {
VU1DrawFinish::VU1DrawFinish()
: VU1Program(&VU1DrawFinish_CodeStart, &VU1DrawFinish_CodeEnd) {}
VU1DrawFinish::~VU1DrawFinish() {}
std::string VU1DrawFinish::getStringName() const {
return std::string("Draw finish");
}
void VU1DrawFinish::addTag(packet2_t* packet, prim_t* prim) const {
packet2_utils_vu_open_unpack(packet, 0, true);
packet2_utils_gs_add_draw_finish_giftag(packet);
packet2_utils_gs_add_prim_giftag(
packet, prim, 1, ((u64)GIF_REG_RGBAQ) << 0 | ((u64)GIF_REG_XYZ2) << 4, 2,
0);
packet2_utils_vu_close_unpack(packet);
}
} // namespace Tyra