diff --git a/Userland/Libraries/LibGPU/RasterizerOptions.h b/Userland/Libraries/LibGPU/RasterizerOptions.h new file mode 100644 index 0000000000..b5dea99e5d --- /dev/null +++ b/Userland/Libraries/LibGPU/RasterizerOptions.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2021, Stephan Unverwerth + * Copyright (c) 2022, Jelle Raaijmakers + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace GPU { + +struct RasterizerOptions { + bool shade_smooth { true }; + bool enable_stencil_test { false }; + bool enable_depth_test { false }; + bool enable_depth_write { true }; + bool enable_alpha_test { false }; + AlphaTestFunction alpha_test_func { AlphaTestFunction::Always }; + float alpha_test_ref_value { 0 }; + bool enable_blending { false }; + BlendFactor blend_source_factor { BlendFactor::One }; + BlendFactor blend_destination_factor { BlendFactor::One }; + u32 color_mask { 0xffffffff }; + float depth_min { 0.f }; + float depth_max { 1.f }; + DepthTestFunction depth_func { DepthTestFunction::Less }; + PolygonMode polygon_mode { PolygonMode::Fill }; + FloatVector4 fog_color { 0.0f, 0.0f, 0.0f, 0.0f }; + float fog_density { 1.0f }; + FogMode fog_mode { FogMode::Exp }; + bool fog_enabled { false }; + float fog_start { 0.0f }; + float fog_end { 1.0f }; + bool scissor_enabled { false }; + bool normalization_enabled { false }; + Gfx::IntRect scissor_box; + bool enable_color_write { true }; + float depth_offset_factor { 0 }; + float depth_offset_constant { 0 }; + bool depth_offset_enabled { false }; + bool enable_culling { false }; + WindingOrder front_face { WindingOrder::CounterClockwise }; + bool cull_back { true }; + bool cull_front { false }; + Array texcoord_generation_enabled_coordinates {}; + Array, NUM_SAMPLERS> texcoord_generation_config {}; + Gfx::IntRect viewport; + bool lighting_enabled { false }; + bool color_material_enabled { false }; + ColorMaterialFace color_material_face { ColorMaterialFace::FrontAndBack }; + ColorMaterialMode color_material_mode { ColorMaterialMode::AmbientAndDiffuse }; +}; + +} diff --git a/Userland/Libraries/LibSoftGPU/Device.cpp b/Userland/Libraries/LibSoftGPU/Device.cpp index fae9c4756d..62f615206d 100644 --- a/Userland/Libraries/LibSoftGPU/Device.cpp +++ b/Userland/Libraries/LibSoftGPU/Device.cpp @@ -589,7 +589,7 @@ GPU::DeviceInfo Device::info() const }; } -static void generate_texture_coordinates(GPU::Vertex& vertex, RasterizerOptions const& options) +static void generate_texture_coordinates(GPU::Vertex& vertex, GPU::RasterizerOptions const& options) { auto generate_coordinate = [&](size_t texcoord_index, size_t config_index) -> float { auto mode = options.texcoord_generation_config[texcoord_index][config_index].mode; @@ -1190,7 +1190,7 @@ void Device::draw_statistics_overlay(Gfx::Bitmap& target) painter.draw_text(target.rect().translated(2, 2), debug_string, font, Gfx::TextAlignment::TopLeft, Gfx::Color::White); } -void Device::set_options(RasterizerOptions const& options) +void Device::set_options(GPU::RasterizerOptions const& options) { m_options = options; diff --git a/Userland/Libraries/LibSoftGPU/Device.h b/Userland/Libraries/LibSoftGPU/Device.h index 76870833e5..14955542d7 100644 --- a/Userland/Libraries/LibSoftGPU/Device.h +++ b/Userland/Libraries/LibSoftGPU/Device.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -38,48 +39,6 @@ namespace SoftGPU { -struct RasterizerOptions { - bool shade_smooth { true }; - bool enable_stencil_test { false }; - bool enable_depth_test { false }; - bool enable_depth_write { true }; - bool enable_alpha_test { false }; - GPU::AlphaTestFunction alpha_test_func { GPU::AlphaTestFunction::Always }; - float alpha_test_ref_value { 0 }; - bool enable_blending { false }; - GPU::BlendFactor blend_source_factor { GPU::BlendFactor::One }; - GPU::BlendFactor blend_destination_factor { GPU::BlendFactor::One }; - u32 color_mask { 0xffffffff }; - float depth_min { 0.f }; - float depth_max { 1.f }; - GPU::DepthTestFunction depth_func { GPU::DepthTestFunction::Less }; - GPU::PolygonMode polygon_mode { GPU::PolygonMode::Fill }; - FloatVector4 fog_color { 0.0f, 0.0f, 0.0f, 0.0f }; - float fog_density { 1.0f }; - GPU::FogMode fog_mode { GPU::FogMode::Exp }; - bool fog_enabled { false }; - float fog_start { 0.0f }; - float fog_end { 1.0f }; - bool scissor_enabled { false }; - bool normalization_enabled { false }; - Gfx::IntRect scissor_box; - bool enable_color_write { true }; - float depth_offset_factor { 0 }; - float depth_offset_constant { 0 }; - bool depth_offset_enabled { false }; - bool enable_culling { false }; - GPU::WindingOrder front_face { GPU::WindingOrder::CounterClockwise }; - bool cull_back { true }; - bool cull_front { false }; - Array texcoord_generation_enabled_coordinates {}; - Array, GPU::NUM_SAMPLERS> texcoord_generation_config {}; - Gfx::IntRect viewport; - bool lighting_enabled { false }; - bool color_material_enabled { false }; - GPU::ColorMaterialFace color_material_face { GPU::ColorMaterialFace::FrontAndBack }; - GPU::ColorMaterialMode color_material_mode { GPU::ColorMaterialMode::AmbientAndDiffuse }; -}; - struct PixelQuad; class Device final { @@ -96,9 +55,9 @@ public: void blit_color_buffer_to(Gfx::Bitmap& target); void blit_to_color_buffer_at_raster_position(Gfx::Bitmap const&); void blit_to_depth_buffer_at_raster_position(Vector const&, int, int); - void set_options(RasterizerOptions const&); + void set_options(GPU::RasterizerOptions const&); void set_light_model_params(GPU::LightModelParameters const&); - RasterizerOptions options() const { return m_options; } + GPU::RasterizerOptions options() const { return m_options; } GPU::LightModelParameters light_model() const { return m_lighting_model; } GPU::ColorType get_color_buffer_pixel(int x, int y); GPU::DepthType get_depthbuffer_value(int x, int y); @@ -124,7 +83,7 @@ private: bool test_alpha(PixelQuad&); RefPtr> m_frame_buffer {}; - RasterizerOptions m_options; + GPU::RasterizerOptions m_options; GPU::LightModelParameters m_lighting_model; Clipper m_clipper; Vector m_triangle_list;