1
0
forked from 0ad/0ad

Reduces uniforms sizes for the Canvas2D shader.

Differential Revision: https://code.wildfiregames.com/D4796
This was SVN commit r27136.
This commit is contained in:
Vladislav Belov 2022-10-09 10:44:51 +00:00
parent a0e006dbbe
commit dffde00e5f
7 changed files with 51 additions and 20 deletions

View File

@ -1,11 +1,14 @@
!!ARBvp1.0
PARAM transform[4] = { program.local[0..3] };
PARAM transform = program.local[0];
PARAM translation = program.local[1];
TEMP position;
DP4 position.x, transform[0], vertex.position;
DP4 position.y, transform[1], vertex.position;
MUL position, transform, vertex.position.xyxy;
ADD position.x, position.x, position.y;
ADD position.y, position.z, position.w;
ADD position, position, translation;
MOV position.z, 0.0;
MOV position.w, 1.0;

View File

@ -4,7 +4,8 @@
<vertex file="arb/canvas2d.vp">
<stream name="pos"/>
<stream name="uv0"/>
<uniform name="transform" loc="0" type="mat4"/>
<uniform name="transform" loc="0" type="vec4"/>
<uniform name="translation" loc="1" type="vec2"/>
</vertex>
<fragment file="arb/canvas2d.fp">

View File

@ -1,6 +1,7 @@
#version 110
uniform mat4 transform;
uniform vec4 transform;
uniform vec2 translation;
attribute vec2 a_vertex;
attribute vec2 a_uv0;
@ -10,5 +11,5 @@ varying vec2 v_uv;
void main()
{
v_uv = a_uv0;
gl_Position = transform * vec4(a_vertex, 0.0, 1.0);
gl_Position = vec4(mat2(transform.xy, transform.zw) * a_vertex + translation, 0.0, 1.0);
}

View File

@ -39,6 +39,7 @@ using PlaneArray2D = std::array<float, 12>;
struct SBindingSlots
{
int32_t transform;
int32_t translation;
int32_t colorAdd;
int32_t colorMul;
int32_t grayscaleFactor;
@ -111,14 +112,20 @@ public:
Renderer::Backend::IShaderProgram* shader = Tech->GetShader();
BindingSlots.transform = shader->GetBindingSlot(str_transform);
BindingSlots.translation = shader->GetBindingSlot(str_translation);
BindingSlots.colorAdd = shader->GetBindingSlot(str_colorAdd);
BindingSlots.colorMul = shader->GetBindingSlot(str_colorMul);
BindingSlots.grayscaleFactor = shader->GetBindingSlot(str_grayscaleFactor);
BindingSlots.tex = shader->GetBindingSlot(str_tex);
const CMatrix3D transform = GetTransform();
TransformScale = CVector2D(transform._11, transform._22);
Translation = CVector2D(transform._14, transform._24);
DeviceCommandContext->SetUniform(
BindingSlots.transform, transform.AsFloatArray());
BindingSlots.transform,
transform._11, transform._21, transform._12, transform._22);
DeviceCommandContext->SetUniform(
BindingSlots.translation, Translation.AsFloatArray());
}
void UnbindTech()
@ -153,6 +160,8 @@ public:
uint32_t WidthInPixels = 1;
uint32_t HeightInPixels = 1;
float Scale = 1.0f;
CVector2D TransformScale;
CVector2D Translation;
Renderer::Backend::IDeviceCommandContext* DeviceCommandContext = nullptr;
CShaderTechniquePtr Tech;
@ -440,7 +449,8 @@ void CCanvas2D::DrawText(CTextRenderer& textRenderer)
m->DeviceCommandContext->SetUniform(
m->BindingSlots.grayscaleFactor, 0.0f);
textRenderer.Render(m->DeviceCommandContext, m->Tech->GetShader(), m->GetTransform());
textRenderer.Render(
m->DeviceCommandContext, m->Tech->GetShader(), m->TransformScale, m->Translation);
}
void CCanvas2D::Flush()

View File

@ -203,7 +203,8 @@ struct SBatchCompare
void CTextRenderer::Render(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
Renderer::Backend::IShaderProgram* shader, const CMatrix3D& transform)
Renderer::Backend::IShaderProgram* shader,
const CVector2D& transformScale, const CVector2D& translation)
{
std::vector<u16> indexes;
std::vector<t2f_v2i> vertexes;
@ -225,11 +226,11 @@ void CTextRenderer::Render(
}
const int32_t texBindingSlot = shader->GetBindingSlot(str_tex);
const int32_t transformBindingSlot = shader->GetBindingSlot(str_transform);
const int32_t translationBindingSlot = shader->GetBindingSlot(str_translation);
const int32_t colorAddBindingSlot = shader->GetBindingSlot(str_colorAdd);
const int32_t colorMulBindingSlot = shader->GetBindingSlot(str_colorMul);
bool transformChanged = false;
bool translationChanged = false;
CTexture* lastTexture = nullptr;
for (std::list<SBatch>::iterator it = m_Batches.begin(); it != m_Batches.end(); ++it)
@ -247,11 +248,10 @@ void CTextRenderer::Render(
if (batch.translate.X != 0.0f || batch.translate.Y != 0.0f)
{
CMatrix3D localTransform;
localTransform.SetTranslation(batch.translate.X, batch.translate.Y, 0.0f);
localTransform = transform * localTransform;
deviceCommandContext->SetUniform(transformBindingSlot, localTransform.AsFloatArray());
transformChanged = true;
const CVector2D localTranslation =
translation + CVector2D(batch.translate.X * transformScale.X, batch.translate.Y * transformScale.Y);
deviceCommandContext->SetUniform(translationBindingSlot, localTranslation.AsFloatArray());
translationChanged = true;
}
// ALPHA-only textures will have .rgb sampled as 0, so we need to
@ -346,6 +346,6 @@ void CTextRenderer::Render(
m_Batches.clear();
if (transformChanged)
deviceCommandContext->SetUniform(transformBindingSlot, transform.AsFloatArray());
if (translationChanged)
deviceCommandContext->SetUniform(translationBindingSlot, translation.AsFloatArray());
}

View File

@ -105,7 +105,8 @@ public:
*/
void Render(
Renderer::Backend::IDeviceCommandContext* deviceCommandContext,
Renderer::Backend::IShaderProgram* shader, const CMatrix3D& transform);
Renderer::Backend::IShaderProgram* shader,
const CVector2D& transformScale, const CVector2D& translation);
private:
friend struct SBatchCompare;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2021 Wildfire Games.
/* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@ -18,6 +18,8 @@
#ifndef INCLUDED_VECTOR2D
#define INCLUDED_VECTOR2D
#include "ps/containers/Span.h"
#include <math.h>
class CSize2D;
@ -161,6 +163,19 @@ public:
void operator+=(const CSize2D& size);
void operator-=(const CSize2D& size);
// Returns 2 element array of floats, e.g. for vec2 uniforms.
PS::span<const float> AsFloatArray() const
{
// Additional check to prevent a weird compiler having a different
// alignement for an array and a class members.
static_assert(
sizeof(CVector2D) == sizeof(float) * 2u &&
offsetof(CVector2D, X) == 0 &&
offsetof(CVector2D, Y) == sizeof(float),
"Vector2D should be properly layouted to use AsFloatArray");
return PS::span<const float>(&X, 2);
}
public:
float X, Y;
};