This commit is contained in:
Junkui Zhang 2025-07-16 14:14:31 +08:00
parent 2017ce3699
commit 1baafae3f7

View file

@ -230,13 +230,10 @@ impl DirectXRenderer {
&self.devices.device_context,
shadows,
)?;
draw_normal(
self.pipelines.shadow_pipeline.draw(
&self.devices.device_context,
&self.pipelines.shadow_pipeline,
&self.context.viewport,
&self.globals.global_params_buffer,
D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP,
4,
shadows.len() as u32,
)
}
@ -250,13 +247,10 @@ impl DirectXRenderer {
&self.devices.device_context,
quads,
)?;
draw_normal(
self.pipelines.quad_pipeline.draw(
&self.devices.device_context,
&self.pipelines.quad_pipeline,
&self.context.viewport,
&self.globals.global_params_buffer,
D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP,
4,
quads.len() as u32,
)
}
@ -355,13 +349,10 @@ impl DirectXRenderer {
&self.devices.device_context,
underlines,
)?;
draw_normal(
self.pipelines.underline_pipeline.draw(
&self.devices.device_context,
&self.pipelines.underline_pipeline,
&self.context.viewport,
&self.globals.global_params_buffer,
D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP,
4,
underlines.len() as u32,
)
}
@ -380,9 +371,8 @@ impl DirectXRenderer {
sprites,
)?;
let texture_view = self.atlas.get_texture_view(texture_id);
draw_with_texture(
self.pipelines.mono_sprites.draw_with_texture(
&self.devices.device_context,
&self.pipelines.mono_sprites,
&texture_view,
&self.context.viewport,
&self.globals.global_params_buffer,
@ -405,9 +395,8 @@ impl DirectXRenderer {
sprites,
)?;
let texture_view = self.atlas.get_texture_view(texture_id);
draw_with_texture(
self.pipelines.poly_sprites.draw_with_texture(
&self.devices.device_context,
&self.pipelines.poly_sprites,
&texture_view,
&self.context.viewport,
&self.globals.global_params_buffer,
@ -658,6 +647,55 @@ impl<T> PipelineState<T> {
}
Ok(())
}
fn draw(
&self,
device_context: &ID3D11DeviceContext,
viewport: &[D3D11_VIEWPORT],
global_params: &[Option<ID3D11Buffer>],
instance_count: u32,
) -> Result<()> {
unsafe {
device_context.VSSetShaderResources(1, Some(&self.view));
device_context.PSSetShaderResources(1, Some(&self.view));
device_context.IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
device_context.RSSetViewports(Some(viewport));
device_context.VSSetShader(&self.vertex, None);
device_context.PSSetShader(&self.fragment, None);
device_context.VSSetConstantBuffers(0, Some(global_params));
device_context.PSSetConstantBuffers(0, Some(global_params));
device_context.DrawInstanced(4, instance_count, 0, 0);
}
Ok(())
}
fn draw_with_texture(
&self,
device_context: &ID3D11DeviceContext,
texture: &[Option<ID3D11ShaderResourceView>],
viewport: &[D3D11_VIEWPORT],
global_params: &[Option<ID3D11Buffer>],
sampler: &[Option<ID3D11SamplerState>],
instance_count: u32,
) -> Result<()> {
unsafe {
device_context.IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
device_context.RSSetViewports(Some(viewport));
device_context.VSSetShader(&self.vertex, None);
device_context.PSSetShader(&self.fragment, None);
device_context.VSSetConstantBuffers(0, Some(global_params));
device_context.PSSetConstantBuffers(0, Some(global_params));
device_context.VSSetShaderResources(1, Some(&self.view));
device_context.PSSetShaderResources(1, Some(&self.view));
device_context.PSSetSamplers(0, Some(sampler));
device_context.VSSetShaderResources(0, Some(texture));
device_context.PSSetShaderResources(0, Some(texture));
device_context.DrawInstanced(4, instance_count, 0, 0);
}
Ok(())
}
}
impl PathsPipelineState {
@ -1167,57 +1205,6 @@ fn draw_indirect(
}
}
fn draw_normal<T>(
device_context: &ID3D11DeviceContext,
pipeline: &PipelineState<T>,
viewport: &[D3D11_VIEWPORT],
global_params: &[Option<ID3D11Buffer>],
topology: D3D_PRIMITIVE_TOPOLOGY,
vertex_count: u32,
instance_count: u32,
) -> Result<()> {
unsafe {
device_context.VSSetShaderResources(1, Some(&pipeline.view));
device_context.PSSetShaderResources(1, Some(&pipeline.view));
device_context.IASetPrimitiveTopology(topology);
device_context.RSSetViewports(Some(viewport));
device_context.VSSetShader(&pipeline.vertex, None);
device_context.PSSetShader(&pipeline.fragment, None);
device_context.VSSetConstantBuffers(0, Some(global_params));
device_context.PSSetConstantBuffers(0, Some(global_params));
device_context.DrawInstanced(vertex_count, instance_count, 0, 0);
}
Ok(())
}
fn draw_with_texture<T>(
device_context: &ID3D11DeviceContext,
pipeline: &PipelineState<T>,
texture: &[Option<ID3D11ShaderResourceView>],
viewport: &[D3D11_VIEWPORT],
global_params: &[Option<ID3D11Buffer>],
sampler: &[Option<ID3D11SamplerState>],
instance_count: u32,
) -> Result<()> {
unsafe {
device_context.IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
device_context.RSSetViewports(Some(viewport));
device_context.VSSetShader(&pipeline.vertex, None);
device_context.PSSetShader(&pipeline.fragment, None);
device_context.VSSetConstantBuffers(0, Some(global_params));
device_context.PSSetConstantBuffers(0, Some(global_params));
device_context.VSSetShaderResources(1, Some(&pipeline.view));
device_context.PSSetShaderResources(1, Some(&pipeline.view));
device_context.PSSetSamplers(0, Some(sampler));
device_context.VSSetShaderResources(0, Some(texture));
device_context.PSSetShaderResources(0, Some(texture));
device_context.DrawInstanced(4, instance_count, 0, 0);
}
Ok(())
}
const BUFFER_COUNT: usize = 3;
mod shader_resources {