diff --git a/miniwin/src/d3drm/backends/gxm/Makefile b/miniwin/src/d3drm/backends/gxm/Makefile deleted file mode 100644 index c7ccf0fd..00000000 --- a/miniwin/src/d3drm/backends/gxm/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -shaders += main.frag.gxp main.vert.gxp image.frag.gxp -shaders += clear.frag.gxp clear.vert.gxp - -all: $(shaders) - -%.vert.gxp: %.vert.cg - ./psp2cgc.exe -Wperf -profile sce_vp_psp2 $< -o $@ - -%.frag.gxp: %.frag.cg - ./psp2cgc.exe -Wperf -profile sce_fp_psp2 $< -o $@ diff --git a/miniwin/src/d3drm/backends/gxm/renderer.cpp b/miniwin/src/d3drm/backends/gxm/renderer.cpp index f7f4d947..40301eea 100644 --- a/miniwin/src/d3drm/backends/gxm/renderer.cpp +++ b/miniwin/src/d3drm/backends/gxm/renderer.cpp @@ -23,7 +23,7 @@ bool with_razor = false; #define VITA_GXM_SCREEN_WIDTH 960 #define VITA_GXM_SCREEN_HEIGHT 544 #define VITA_GXM_SCREEN_STRIDE 960 -#define VITA_GXM_PENDING_SWAPS 2 +#define VITA_GXM_PENDING_SWAPS 3 #define VITA_GXM_COLOR_FORMAT SCE_GXM_COLOR_FORMAT_A8B8G8R8 #define VITA_GXM_PIXEL_FORMAT SCE_DISPLAY_PIXELFORMAT_A8B8G8R8 @@ -41,11 +41,11 @@ typedef struct Vertex { } Vertex; -INCBIN(main_vert_gxp, "main.vert.gxp"); -INCBIN(main_frag_gxp, "main.frag.gxp"); -INCBIN(clear_vert_gxp, "clear.vert.gxp"); -INCBIN(clear_frag_gxp, "clear.frag.gxp"); -INCBIN(image_frag_gxp, "image.frag.gxp"); +INCBIN(main_vert_gxp, "shaders/main.vert.gxp"); +INCBIN(main_frag_gxp, "shaders/main.frag.gxp"); +INCBIN(clear_vert_gxp, "shaders/clear.vert.gxp"); +INCBIN(clear_frag_gxp, "shaders/clear.frag.gxp"); +INCBIN(image_frag_gxp, "shaders/image.frag.gxp"); const SceGxmProgram* mainVertexProgramGxp = (const SceGxmProgram*)_inc_main_vert_gxpData; const SceGxmProgram* mainFragmentProgramGxp = (const SceGxmProgram*)_inc_main_frag_gxpData; @@ -481,7 +481,7 @@ static bool create_gxm_renderer(int width, int height, GXMRendererData* data) { // image if(SCE_ERR(sceGxmShaderPatcherCreateFragmentProgram, data->shaderPatcher, - data->mainFragmentProgramId, + data->imageFragmentProgramId, SCE_GXM_OUTPUT_REGISTER_FORMAT_UCHAR4, SCE_GXM_MULTISAMPLE_NONE, &blendInfoTransparent, @@ -490,9 +490,9 @@ static bool create_gxm_renderer(int width, int height, GXMRendererData* data) { )) return false; // vertex uniforms - data->uModelViewMatrixParam = sceGxmProgramFindParameterByName(mainVertexProgramGxp, "uModelViewMatrix"); - data->uNormalMatrixParam = sceGxmProgramFindParameterByName(mainVertexProgramGxp, "uNormalMatrix"); - data->uProjectionMatrixParam = sceGxmProgramFindParameterByName(mainVertexProgramGxp, "uProjectionMatrix"); + data->uModelViewMatrix = sceGxmProgramFindParameterByName(mainVertexProgramGxp, "uModelViewMatrix"); + data->uNormalMatrix = sceGxmProgramFindParameterByName(mainVertexProgramGxp, "uNormalMatrix"); + data->uProjectionMatrix = sceGxmProgramFindParameterByName(mainVertexProgramGxp, "uProjectionMatrix"); // fragment uniforms data->uLights = sceGxmProgramFindParameterByName(mainFragmentProgramGxp, "uLights"); // SceneLight[3] @@ -530,31 +530,6 @@ static bool create_gxm_renderer(int width, int height, GXMRendererData* data) { } -#define VITA_GXM_PENDING_SWAPS 2 - -/* -#include -static tai_hook_ref_t local_open_hook; - -extern "C" { - SceUID hook_local_open(const char *path, int flags, SceMode mode) { - SceUID fd = ({ - struct _tai_hook_user *cur, *next; - cur = (struct _tai_hook_user *)(local_open_hook); - next = (struct _tai_hook_user *)cur->next; - (next == __null) ? - ((SceUID(*)(const char*, int, int))cur->old)(path, flags, mode) : - ((SceUID(*)(const char*, int, int))next->func)(path, flags, mode); - }); - - printf("open in razor: %s, ret: %x", path, fd); - return fd; - } -} -*/ - - - Direct3DRMRenderer* GXMRenderer::Create(DWORD width, DWORD height) { SDL_Log("GXMRenderer::Create width=%d height=%d", width, height); @@ -577,7 +552,11 @@ GXMRenderer::GXMRenderer( DWORD width, DWORD height, GXMRendererData data -) : m_width(width), m_height(height), m_data(data) { +) : m_data(data) { + m_width = width; + m_height = height; + m_virtualWidth = width; + m_virtualHeight = height; m_initialized = true; } @@ -810,8 +789,7 @@ void GXMRenderer::GetDesc(D3DDEVICEDESC* halDesc, D3DDEVICEDESC* helDesc) memset(helDesc, 0, sizeof(D3DDEVICEDESC)); } -const char* GXMRenderer::GetName() -{ +const char* GXMRenderer::GetName() { return "GXM"; } @@ -906,6 +884,10 @@ void GXMRenderer::SubmitDraw( ) { auto& mesh = m_meshes[meshId]; + char marker[256]; + snprintf(marker, sizeof(marker), "SubmitDraw: %d", meshId); + sceGxmPushUserMarker(this->m_data.context, marker); + sceGxmSetVertexProgram(this->m_data.context, this->m_data.mainVertexProgram); if(this->transparencyEnabled) { sceGxmSetFragmentProgram(this->m_data.context, this->m_data.transparentFragmentProgram); @@ -918,9 +900,14 @@ void GXMRenderer::SubmitDraw( sceGxmReserveVertexDefaultUniformBuffer(this->m_data.context, &vertUniforms); sceGxmReserveFragmentDefaultUniformBuffer(this->m_data.context, &fragUniforms); - SET_UNIFORM(vertUniforms, this->m_data.uModelViewMatrixParam, modelViewMatrix, mainVertexProgramGxp); - SET_UNIFORM(vertUniforms, this->m_data.uNormalMatrixParam, normalMatrix, mainVertexProgramGxp); - SET_UNIFORM(vertUniforms, this->m_data.uProjectionMatrixParam, m_projection, mainVertexProgramGxp); + D3DRMMATRIX4D modelViewMatrixTrans; + D3DRMMATRIX4D projectionTrans; + transpose4x4(modelViewMatrix, modelViewMatrixTrans); + transpose4x4(m_projection, projectionTrans); + + SET_UNIFORM(vertUniforms, this->m_data.uModelViewMatrix, modelViewMatrixTrans, mainVertexProgramGxp); + SET_UNIFORM(vertUniforms, this->m_data.uNormalMatrix, normalMatrix, mainVertexProgramGxp); + SET_UNIFORM(vertUniforms, this->m_data.uProjectionMatrix, projectionTrans, mainVertexProgramGxp); float color[4] = { appearance.color.r / 255.0f, @@ -946,6 +933,8 @@ void GXMRenderer::SubmitDraw( mesh.indexBuffer, mesh.indexCount ); + + sceGxmPopUserMarker(this->m_data.context); } HRESULT GXMRenderer::FinalizeFrame() { @@ -961,6 +950,10 @@ void GXMRenderer::Resize(int width, int height, const ViewportTransform& viewpor void GXMRenderer::Clear(float r, float g, float b) { this->StartScene(); + char marker[256]; + snprintf(marker, sizeof(marker), "Clear"); + sceGxmPushUserMarker(this->m_data.context, marker); + sceGxmSetVertexProgram(this->m_data.context, this->m_data.clearVertexProgram); sceGxmSetFragmentProgram(this->m_data.context, this->m_data.clearFragmentProgram); @@ -979,6 +972,8 @@ void GXMRenderer::Clear(float r, float g, float b) { SCE_GXM_INDEX_FORMAT_U16, this->m_data.clearIndicies, 3 ); + + sceGxmPopUserMarker(this->m_data.context); } void GXMRenderer::Flip() { @@ -1008,7 +1003,7 @@ void GXMRenderer::Flip() { this->backBufferIndex = (this->backBufferIndex + 1) % VITA_GXM_DISPLAY_BUFFER_COUNT; } -void CreateOrthoMatrix(float left, float right, float bottom, float top, D3DRMMATRIX4D& outMatrix) +static void CreateOrthoMatrix(float left, float right, float bottom, float top, D3DRMMATRIX4D& outMatrix) { float near = -1.0f; float far = 1.0f; @@ -1040,6 +1035,10 @@ void CreateOrthoMatrix(float left, float right, float bottom, float top, D3DRMMA void GXMRenderer::Draw2DImage(Uint32 textureId, const SDL_Rect& srcRect, const SDL_Rect& dstRect) { this->StartScene(); + char marker[256]; + snprintf(marker, sizeof(marker), "Draw2DImage: %d", textureId); + sceGxmPushUserMarker(this->m_data.context, marker); + sceGxmSetVertexProgram(this->m_data.context, this->m_data.mainVertexProgram); sceGxmSetFragmentProgram(this->m_data.context, this->m_data.imageFragmentProgram); @@ -1057,10 +1056,11 @@ void GXMRenderer::Draw2DImage(Uint32 textureId, const SDL_Rect& srcRect, const S CreateOrthoMatrix(left, right, bottom, top, projection); D3DRMMATRIX4D identity = {{1.f, 0.f, 0.f, 0.f}, {0.f, 1.f, 0.f, 0.f}, {0.f, 0.f, 1.f, 0.f}, {0.f, 0.f, 0.f, 1.f}}; + Matrix3x3 normal = {{1.f, 0.f, 0.f}, {0.f, 1.f, 0.f}, {0.f, 0.f, 1.f}}; - SET_UNIFORM(vertUniforms, this->m_data.uModelViewMatrixParam, identity, mainVertexProgramGxp); - SET_UNIFORM(vertUniforms, this->m_data.uNormalMatrixParam, identity, mainVertexProgramGxp); - SET_UNIFORM(vertUniforms, this->m_data.uProjectionMatrixParam, m_projection, mainVertexProgramGxp); + SET_UNIFORM(vertUniforms, this->m_data.uModelViewMatrix, identity, mainVertexProgramGxp); // float4x4 + SET_UNIFORM(vertUniforms, this->m_data.uNormalMatrix, normal, mainVertexProgramGxp); // float3x3 + SET_UNIFORM(vertUniforms, this->m_data.uProjectionMatrix, projection, mainVertexProgramGxp); // float4x4 const GXMTextureCacheEntry& texture = m_textures[textureId]; sceGxmSetFragmentTexture(this->m_data.context, 0, &texture.gxmTexture); @@ -1100,6 +1100,7 @@ void GXMRenderer::Draw2DImage(Uint32 textureId, const SDL_Rect& srcRect, const S gpuIndices, 4 ); + sceGxmPopUserMarker(this->m_data.context); sceClibMspaceFree(this->m_data.cdramPool, meshBuffer); } diff --git a/miniwin/src/d3drm/backends/gxm/shaders/Makefile b/miniwin/src/d3drm/backends/gxm/shaders/Makefile new file mode 100644 index 00000000..359e2bf9 --- /dev/null +++ b/miniwin/src/d3drm/backends/gxm/shaders/Makefile @@ -0,0 +1,15 @@ +shaders += main.frag.gxp main.vert.gxp image.frag.gxp +shaders += clear.frag.gxp clear.vert.gxp + +all: $(shaders) + +CGCFLAGS = -Wperf -cache -cachedir cache + +cache: + mkdir -p cache + +%.vert.gxp: %.vert.cg | cache + ./psp2cgc.exe $(CGCFLAGS) -profile sce_vp_psp2 $< -o $@ + +%.frag.gxp: %.frag.cg | cache + ./psp2cgc.exe $(CGCFLAGS) -profile sce_fp_psp2 $< -o $@ diff --git a/miniwin/src/d3drm/backends/gxm/shaders/cache/clear.frag_550b7e0c6c421575.sdb b/miniwin/src/d3drm/backends/gxm/shaders/cache/clear.frag_550b7e0c6c421575.sdb new file mode 100644 index 00000000..1303ead5 Binary files /dev/null and b/miniwin/src/d3drm/backends/gxm/shaders/cache/clear.frag_550b7e0c6c421575.sdb differ diff --git a/miniwin/src/d3drm/backends/gxm/shaders/cache/clear.vert_98a2a6664d8485bc.sdb b/miniwin/src/d3drm/backends/gxm/shaders/cache/clear.vert_98a2a6664d8485bc.sdb new file mode 100644 index 00000000..f7f4dce5 Binary files /dev/null and b/miniwin/src/d3drm/backends/gxm/shaders/cache/clear.vert_98a2a6664d8485bc.sdb differ diff --git a/miniwin/src/d3drm/backends/gxm/shaders/cache/image.frag_ae725a8caae9bf47.sdb b/miniwin/src/d3drm/backends/gxm/shaders/cache/image.frag_ae725a8caae9bf47.sdb new file mode 100644 index 00000000..1b709925 Binary files /dev/null and b/miniwin/src/d3drm/backends/gxm/shaders/cache/image.frag_ae725a8caae9bf47.sdb differ diff --git a/miniwin/src/d3drm/backends/gxm/shaders/cache/main.frag_a5f9016b18a6a10c.sdb b/miniwin/src/d3drm/backends/gxm/shaders/cache/main.frag_a5f9016b18a6a10c.sdb new file mode 100644 index 00000000..72c257d0 Binary files /dev/null and b/miniwin/src/d3drm/backends/gxm/shaders/cache/main.frag_a5f9016b18a6a10c.sdb differ diff --git a/miniwin/src/d3drm/backends/gxm/shaders/cache/main.vert_02c4a0c27e7c3246.sdb b/miniwin/src/d3drm/backends/gxm/shaders/cache/main.vert_02c4a0c27e7c3246.sdb new file mode 100644 index 00000000..c7044589 Binary files /dev/null and b/miniwin/src/d3drm/backends/gxm/shaders/cache/main.vert_02c4a0c27e7c3246.sdb differ diff --git a/miniwin/src/d3drm/backends/gxm/clear.frag.cg b/miniwin/src/d3drm/backends/gxm/shaders/clear.frag.cg similarity index 100% rename from miniwin/src/d3drm/backends/gxm/clear.frag.cg rename to miniwin/src/d3drm/backends/gxm/shaders/clear.frag.cg diff --git a/miniwin/src/d3drm/backends/gxm/clear.frag.gxp b/miniwin/src/d3drm/backends/gxm/shaders/clear.frag.gxp similarity index 100% rename from miniwin/src/d3drm/backends/gxm/clear.frag.gxp rename to miniwin/src/d3drm/backends/gxm/shaders/clear.frag.gxp diff --git a/miniwin/src/d3drm/backends/gxm/clear.vert.cg b/miniwin/src/d3drm/backends/gxm/shaders/clear.vert.cg similarity index 100% rename from miniwin/src/d3drm/backends/gxm/clear.vert.cg rename to miniwin/src/d3drm/backends/gxm/shaders/clear.vert.cg diff --git a/miniwin/src/d3drm/backends/gxm/clear.vert.gxp b/miniwin/src/d3drm/backends/gxm/shaders/clear.vert.gxp similarity index 100% rename from miniwin/src/d3drm/backends/gxm/clear.vert.gxp rename to miniwin/src/d3drm/backends/gxm/shaders/clear.vert.gxp diff --git a/miniwin/src/d3drm/backends/gxm/image.frag.cg b/miniwin/src/d3drm/backends/gxm/shaders/image.frag.cg similarity index 100% rename from miniwin/src/d3drm/backends/gxm/image.frag.cg rename to miniwin/src/d3drm/backends/gxm/shaders/image.frag.cg diff --git a/miniwin/src/d3drm/backends/gxm/image.frag.gxp b/miniwin/src/d3drm/backends/gxm/shaders/image.frag.gxp similarity index 100% rename from miniwin/src/d3drm/backends/gxm/image.frag.gxp rename to miniwin/src/d3drm/backends/gxm/shaders/image.frag.gxp diff --git a/miniwin/src/d3drm/backends/gxm/main.frag.cg b/miniwin/src/d3drm/backends/gxm/shaders/main.frag.cg similarity index 100% rename from miniwin/src/d3drm/backends/gxm/main.frag.cg rename to miniwin/src/d3drm/backends/gxm/shaders/main.frag.cg diff --git a/miniwin/src/d3drm/backends/gxm/main.frag.gxp b/miniwin/src/d3drm/backends/gxm/shaders/main.frag.gxp similarity index 100% rename from miniwin/src/d3drm/backends/gxm/main.frag.gxp rename to miniwin/src/d3drm/backends/gxm/shaders/main.frag.gxp diff --git a/miniwin/src/d3drm/backends/gxm/main.vert.cg b/miniwin/src/d3drm/backends/gxm/shaders/main.vert.cg similarity index 100% rename from miniwin/src/d3drm/backends/gxm/main.vert.cg rename to miniwin/src/d3drm/backends/gxm/shaders/main.vert.cg diff --git a/miniwin/src/d3drm/backends/gxm/main.vert.gxp b/miniwin/src/d3drm/backends/gxm/shaders/main.vert.gxp similarity index 100% rename from miniwin/src/d3drm/backends/gxm/main.vert.gxp rename to miniwin/src/d3drm/backends/gxm/shaders/main.vert.gxp diff --git a/miniwin/src/internal/d3drmrenderer_gxm.h b/miniwin/src/internal/d3drmrenderer_gxm.h index bf55b84a..59d50aa7 100644 --- a/miniwin/src/internal/d3drmrenderer_gxm.h +++ b/miniwin/src/internal/d3drmrenderer_gxm.h @@ -13,7 +13,7 @@ DEFINE_GUID(GXM_GUID, 0x682656F3, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x58, 0x4D); -#define VITA_GXM_DISPLAY_BUFFER_COUNT 2 +#define VITA_GXM_DISPLAY_BUFFER_COUNT 3 struct GXMTextureCacheEntry { IDirect3DRMTexture* texture; @@ -103,9 +103,9 @@ typedef struct GXMRendererData { SceGxmFragmentProgram* imageFragmentProgram; // 2d images, no lighting // main shader vertex uniforms - const SceGxmProgramParameter* uModelViewMatrixParam; - const SceGxmProgramParameter* uNormalMatrixParam; - const SceGxmProgramParameter* uProjectionMatrixParam; + const SceGxmProgramParameter* uModelViewMatrix; + const SceGxmProgramParameter* uNormalMatrix; + const SceGxmProgramParameter* uProjectionMatrix; // main shader fragment uniforms const SceGxmProgramParameter* uLights; @@ -171,7 +171,6 @@ class GXMRenderer : public Direct3DRMRenderer { std::vector m_textures; std::vector m_meshes; D3DRMMATRIX4D m_projection; - DWORD m_width, m_height; std::vector m_lights; bool transparencyEnabled = false;