built-in Blit operation
parent
8229e5dd33
commit
31c79d3179
|
@ -26,8 +26,8 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<EmbeddedResource Include="src\Graphics\StockShaders\Binary\video_fullscreen.vert.refresh">
|
<EmbeddedResource Include="src\Graphics\StockShaders\Binary\fullscreen.vert.refresh">
|
||||||
<LogicalName>MoonWorks.Graphics.StockShaders.VideoFullscreen.vert.refresh</LogicalName>
|
<LogicalName>MoonWorks.Graphics.StockShaders.Fullscreen.vert.refresh</LogicalName>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
<EmbeddedResource Include="src\Graphics\StockShaders\Binary\video_yuv2rgba.frag.refresh">
|
<EmbeddedResource Include="src\Graphics\StockShaders\Binary\video_yuv2rgba.frag.refresh">
|
||||||
<LogicalName>MoonWorks.Graphics.StockShaders.VideoYUV2RGBA.frag.refresh</LogicalName>
|
<LogicalName>MoonWorks.Graphics.StockShaders.VideoYUV2RGBA.frag.refresh</LogicalName>
|
||||||
|
@ -38,5 +38,8 @@
|
||||||
<EmbeddedResource Include="src\Graphics\StockShaders\Binary\text_msdf.frag.refresh">
|
<EmbeddedResource Include="src\Graphics\StockShaders\Binary\text_msdf.frag.refresh">
|
||||||
<LogicalName>MoonWorks.Graphics.StockShaders.TextMSDF.frag.refresh</LogicalName>
|
<LogicalName>MoonWorks.Graphics.StockShaders.TextMSDF.frag.refresh</LogicalName>
|
||||||
</EmbeddedResource>
|
</EmbeddedResource>
|
||||||
|
<EmbeddedResource Include="src\Graphics\StockShaders\Binary\blit.frag.refresh">
|
||||||
|
<LogicalName>MoonWorks.Graphics.StockShaders.Blit.frag.refresh</LogicalName>
|
||||||
|
</EmbeddedResource>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -87,6 +87,7 @@ namespace MoonWorks.Graphics
|
||||||
) {
|
) {
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
AssertNotSubmitted();
|
AssertNotSubmitted();
|
||||||
|
AssertNotInPass("Cannot begin a render pass inside another pass!");
|
||||||
AssertTextureNotNull(colorAttachmentInfo);
|
AssertTextureNotNull(colorAttachmentInfo);
|
||||||
AssertColorTarget(colorAttachmentInfo);
|
AssertColorTarget(colorAttachmentInfo);
|
||||||
#endif
|
#endif
|
||||||
|
@ -528,6 +529,7 @@ namespace MoonWorks.Graphics
|
||||||
public void BeginComputePass()
|
public void BeginComputePass()
|
||||||
{
|
{
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
|
AssertNotSubmitted();
|
||||||
AssertNotInPass("Cannot begin compute pass while in another pass!");
|
AssertNotInPass("Cannot begin compute pass while in another pass!");
|
||||||
computePassActive = true;
|
computePassActive = true;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1844,6 +1846,25 @@ namespace MoonWorks.Graphics
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Blits a texture to another texture with the specified filter.
|
||||||
|
///
|
||||||
|
/// This operation cannot be performed inside any pass.
|
||||||
|
/// </summary>
|
||||||
|
public void Blit(
|
||||||
|
Texture source,
|
||||||
|
Texture destination,
|
||||||
|
Filter filter
|
||||||
|
) {
|
||||||
|
var sampler = filter == Filter.Linear ? Device.LinearSampler : Device.PointSampler;
|
||||||
|
|
||||||
|
BeginRenderPass(new ColorAttachmentInfo(destination));
|
||||||
|
BindGraphicsPipeline(Device.BlitPipeline);
|
||||||
|
BindFragmentSamplers(new TextureSamplerBinding(source, sampler));
|
||||||
|
DrawPrimitives(0, 2);
|
||||||
|
EndRenderPass();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Acquires a swapchain texture.
|
/// Acquires a swapchain texture.
|
||||||
/// This texture will be presented to the given window when the command buffer is submitted.
|
/// This texture will be presented to the given window when the command buffer is submitted.
|
||||||
|
|
|
@ -22,6 +22,9 @@ namespace MoonWorks.Graphics
|
||||||
// Built-in video pipeline
|
// Built-in video pipeline
|
||||||
internal GraphicsPipeline VideoPipeline { get; }
|
internal GraphicsPipeline VideoPipeline { get; }
|
||||||
|
|
||||||
|
// Built-in blit pipeline
|
||||||
|
internal GraphicsPipeline BlitPipeline { get; }
|
||||||
|
|
||||||
// Built-in text shader info
|
// Built-in text shader info
|
||||||
public GraphicsShaderInfo TextVertexShaderInfo { get; }
|
public GraphicsShaderInfo TextVertexShaderInfo { get; }
|
||||||
public GraphicsShaderInfo TextFragmentShaderInfo { get; }
|
public GraphicsShaderInfo TextFragmentShaderInfo { get; }
|
||||||
|
@ -57,32 +60,43 @@ namespace MoonWorks.Graphics
|
||||||
// Check for replacement stock shaders
|
// Check for replacement stock shaders
|
||||||
string basePath = System.AppContext.BaseDirectory;
|
string basePath = System.AppContext.BaseDirectory;
|
||||||
|
|
||||||
string videoVertPath = Path.Combine(basePath, "video_fullscreen.vert.refresh");
|
string fullscreenVertPath = Path.Combine(basePath, "fullscreen.vert.refresh");
|
||||||
string videoFragPath = Path.Combine(basePath, "video_yuv2rgba.frag.refresh");
|
|
||||||
|
|
||||||
string textVertPath = Path.Combine(basePath, "text_transform.vert.refresh");
|
string textVertPath = Path.Combine(basePath, "text_transform.vert.refresh");
|
||||||
string textFragPath = Path.Combine(basePath, "text_msdf.frag.refresh");
|
string textFragPath = Path.Combine(basePath, "text_msdf.frag.refresh");
|
||||||
|
|
||||||
ShaderModule videoVertShader;
|
string videoFragPath = Path.Combine(basePath, "video_yuv2rgba.frag.refresh");
|
||||||
ShaderModule videoFragShader;
|
string blitFragPath = Path.Combine(basePath, "blit.frag.refresh");
|
||||||
|
|
||||||
|
ShaderModule fullscreenVertShader;
|
||||||
|
|
||||||
ShaderModule textVertShader;
|
ShaderModule textVertShader;
|
||||||
ShaderModule textFragShader;
|
ShaderModule textFragShader;
|
||||||
|
|
||||||
if (File.Exists(videoVertPath) && File.Exists(videoFragPath))
|
ShaderModule videoFragShader;
|
||||||
|
ShaderModule blitFragShader;
|
||||||
|
|
||||||
|
if (File.Exists(fullscreenVertPath))
|
||||||
|
{
|
||||||
|
fullscreenVertShader = new ShaderModule(this, fullscreenVertPath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// use defaults
|
||||||
|
var assembly = typeof(GraphicsDevice).Assembly;
|
||||||
|
using var vertStream = assembly.GetManifestResourceStream("MoonWorks.Graphics.StockShaders.Fullscreen.vert.refresh");
|
||||||
|
fullscreenVertShader = new ShaderModule(this, vertStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (File.Exists(videoFragPath))
|
||||||
{
|
{
|
||||||
videoVertShader = new ShaderModule(this, videoVertPath);
|
|
||||||
videoFragShader = new ShaderModule(this, videoFragPath);
|
videoFragShader = new ShaderModule(this, videoFragPath);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// use defaults
|
// use defaults
|
||||||
var assembly = typeof(GraphicsDevice).Assembly;
|
var assembly = typeof(GraphicsDevice).Assembly;
|
||||||
|
|
||||||
using var vertStream = assembly.GetManifestResourceStream("MoonWorks.Graphics.StockShaders.VideoFullscreen.vert.refresh");
|
|
||||||
using var fragStream = assembly.GetManifestResourceStream("MoonWorks.Graphics.StockShaders.VideoYUV2RGBA.frag.refresh");
|
using var fragStream = assembly.GetManifestResourceStream("MoonWorks.Graphics.StockShaders.VideoYUV2RGBA.frag.refresh");
|
||||||
|
|
||||||
videoVertShader = new ShaderModule(this, vertStream);
|
|
||||||
videoFragShader = new ShaderModule(this, fragStream);
|
videoFragShader = new ShaderModule(this, fragStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,6 +117,19 @@ namespace MoonWorks.Graphics
|
||||||
textFragShader = new ShaderModule(this, fragStream);
|
textFragShader = new ShaderModule(this, fragStream);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (File.Exists(blitFragPath))
|
||||||
|
{
|
||||||
|
blitFragShader = new ShaderModule(this, blitFragPath);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// use defaults
|
||||||
|
var assembly = typeof(GraphicsDevice).Assembly;
|
||||||
|
|
||||||
|
using var fragStream = assembly.GetManifestResourceStream("MoonWorks.Graphics.StockShaders.Blit.frag.refresh");
|
||||||
|
blitFragShader = new ShaderModule(this, fragStream);
|
||||||
|
}
|
||||||
|
|
||||||
VideoPipeline = new GraphicsPipeline(
|
VideoPipeline = new GraphicsPipeline(
|
||||||
this,
|
this,
|
||||||
new GraphicsPipelineCreateInfo
|
new GraphicsPipelineCreateInfo
|
||||||
|
@ -115,7 +142,7 @@ namespace MoonWorks.Graphics
|
||||||
),
|
),
|
||||||
DepthStencilState = DepthStencilState.Disable,
|
DepthStencilState = DepthStencilState.Disable,
|
||||||
VertexShaderInfo = GraphicsShaderInfo.Create(
|
VertexShaderInfo = GraphicsShaderInfo.Create(
|
||||||
videoVertShader,
|
fullscreenVertShader,
|
||||||
"main",
|
"main",
|
||||||
0
|
0
|
||||||
),
|
),
|
||||||
|
@ -131,6 +158,34 @@ namespace MoonWorks.Graphics
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
BlitPipeline = new GraphicsPipeline(
|
||||||
|
this,
|
||||||
|
new GraphicsPipelineCreateInfo
|
||||||
|
{
|
||||||
|
AttachmentInfo = new GraphicsPipelineAttachmentInfo(
|
||||||
|
new ColorAttachmentDescription(
|
||||||
|
TextureFormat.R8G8B8A8,
|
||||||
|
ColorAttachmentBlendState.None
|
||||||
|
)
|
||||||
|
),
|
||||||
|
DepthStencilState = DepthStencilState.Disable,
|
||||||
|
VertexShaderInfo = GraphicsShaderInfo.Create(
|
||||||
|
fullscreenVertShader,
|
||||||
|
"main",
|
||||||
|
0
|
||||||
|
),
|
||||||
|
FragmentShaderInfo = GraphicsShaderInfo.Create(
|
||||||
|
blitFragShader,
|
||||||
|
"main",
|
||||||
|
1
|
||||||
|
),
|
||||||
|
VertexInputState = VertexInputState.Empty,
|
||||||
|
RasterizerState = RasterizerState.CCW_CullNone,
|
||||||
|
PrimitiveType = PrimitiveType.TriangleList,
|
||||||
|
MultisampleState = MultisampleState.None
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
TextVertexShaderInfo = GraphicsShaderInfo.Create<Math.Float.Matrix4x4>(textVertShader, "main", 0);
|
TextVertexShaderInfo = GraphicsShaderInfo.Create<Math.Float.Matrix4x4>(textVertShader, "main", 0);
|
||||||
TextFragmentShaderInfo = GraphicsShaderInfo.Create<float>(textFragShader, "main", 1);
|
TextFragmentShaderInfo = GraphicsShaderInfo.Create<float>(textFragShader, "main", 1);
|
||||||
TextVertexInputState = VertexInputState.CreateSingleBinding<Font.Vertex>();
|
TextVertexInputState = VertexInputState.CreateSingleBinding<Font.Vertex>();
|
||||||
|
|
|
@ -113,7 +113,7 @@ namespace MoonWorks.Graphics
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public unsafe void GetData<T>(
|
public unsafe void GetData<T>(
|
||||||
Span<T> data,
|
Span<T> data,
|
||||||
uint bufferOffsetInBytes
|
uint bufferOffsetInBytes = 0
|
||||||
) where T : unmanaged
|
) where T : unmanaged
|
||||||
{
|
{
|
||||||
var elementSize = Marshal.SizeOf<T>();
|
var elementSize = Marshal.SizeOf<T>();
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,12 @@
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout (location = 0) in vec2 TexCoord;
|
||||||
|
|
||||||
|
layout (location = 0) out vec4 FragColor;
|
||||||
|
|
||||||
|
layout (binding = 0, set = 1) uniform sampler2D TexSampler;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
FragColor = texture(TexSampler, TexCoord);
|
||||||
|
}
|
Loading…
Reference in New Issue