diff options
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Libraries/LibSoftGPU/Buffer/Typed2DBuffer.h | 6 | ||||
-rw-r--r-- | Userland/Libraries/LibSoftGPU/Device.cpp | 43 | ||||
-rw-r--r-- | Userland/Libraries/LibSoftGPU/Device.h | 3 |
3 files changed, 21 insertions, 31 deletions
diff --git a/Userland/Libraries/LibSoftGPU/Buffer/Typed2DBuffer.h b/Userland/Libraries/LibSoftGPU/Buffer/Typed2DBuffer.h index b056f4257e..eefde5e940 100644 --- a/Userland/Libraries/LibSoftGPU/Buffer/Typed2DBuffer.h +++ b/Userland/Libraries/LibSoftGPU/Buffer/Typed2DBuffer.h @@ -47,11 +47,13 @@ public: } } - void blit_to_bitmap(Gfx::Bitmap& bitmap, Gfx::IntRect const& target) const requires IsSame<T, u32> + void blit_flipped_to_bitmap(Gfx::Bitmap& bitmap, Gfx::IntRect const& target) const requires IsSame<T, u32> { VERIFY(bitmap.format() == Gfx::BitmapFormat::BGRA8888 || bitmap.format() == Gfx::BitmapFormat::BGRx8888); int source_y = 0; - for (int y = target.top(); y <= target.bottom(); ++y) { + + // NOTE: we are flipping the Y-coordinate here, which is OpenGL-specific: (0, 0) is considered the lower-left corner of the window + for (int y = target.bottom(); y >= target.top(); --y) { auto const* buffer_scanline = scanline(source_y++); auto* bitmap_scanline = bitmap.scanline(y); diff --git a/Userland/Libraries/LibSoftGPU/Device.cpp b/Userland/Libraries/LibSoftGPU/Device.cpp index f026927b74..59a8855b0c 100644 --- a/Userland/Libraries/LibSoftGPU/Device.cpp +++ b/Userland/Libraries/LibSoftGPU/Device.cpp @@ -94,16 +94,6 @@ static Vector4<f32x4> to_vec4(u32x4 bgra) }; } -Gfx::IntRect Device::window_coordinates_to_target_coordinates(Gfx::IntRect const& window_rect) -{ - return { - window_rect.x(), - m_frame_buffer->rect().height() - window_rect.height() - window_rect.y(), - window_rect.width(), - window_rect.height(), - }; -} - void Device::setup_blend_factors() { m_alpha_blend_factors = {}; @@ -215,7 +205,7 @@ void Device::rasterize_triangle(const Triangle& triangle) auto render_bounds = m_frame_buffer->rect(); if (m_options.scissor_enabled) - render_bounds.intersect(window_coordinates_to_target_coordinates(m_options.scissor_box)); + render_bounds.intersect(m_options.scissor_box); // Obey top-left rule: // This sets up "zero" for later pixel coverage tests. @@ -759,7 +749,7 @@ void Device::draw_primitives(PrimitiveType primitive_type, FloatMatrix4x4 const& } // Now let's transform each triangle and send that to the GPU - auto const viewport = window_coordinates_to_target_coordinates(m_options.viewport); + auto const viewport = m_options.viewport; auto const viewport_half_width = viewport.width() / 2.0f; auto const viewport_half_height = viewport.height() / 2.0f; auto const viewport_center_x = viewport.x() + viewport_half_width; @@ -939,10 +929,10 @@ void Device::draw_primitives(PrimitiveType primitive_type, FloatMatrix4x4 const& one_over_w, }; - // To window coordinates - note that we flip the Y coordinate into target space + // To window coordinates vec.window_coordinates = { viewport_center_x + ndc_coordinates.x() * viewport_half_width, - viewport_center_y - ndc_coordinates.y() * viewport_half_height, + viewport_center_y + ndc_coordinates.y() * viewport_half_height, depth_halfway + ndc_coordinates.z() * depth_half_range, ndc_coordinates.w(), }; @@ -979,7 +969,7 @@ void Device::draw_primitives(PrimitiveType primitive_type, FloatMatrix4x4 const& continue; if (m_options.enable_culling) { - bool is_front = (m_options.front_face == WindingOrder::CounterClockwise ? area < 0 : area > 0); + bool is_front = (m_options.front_face == WindingOrder::CounterClockwise ? area > 0 : area < 0); if (!is_front && m_options.cull_back) continue; @@ -1123,18 +1113,18 @@ void Device::clear_color(FloatVector4 const& color) { auto const fill_color = to_bgra32(color); - auto fill_rect = m_frame_buffer->rect(); + auto clear_rect = m_frame_buffer->rect(); if (m_options.scissor_enabled) - fill_rect.intersect(window_coordinates_to_target_coordinates(m_options.scissor_box)); + clear_rect.intersect(m_options.scissor_box); - m_frame_buffer->color_buffer()->fill(fill_color, fill_rect); + m_frame_buffer->color_buffer()->fill(fill_color, clear_rect); } void Device::clear_depth(DepthType depth) { auto clear_rect = m_frame_buffer->rect(); if (m_options.scissor_enabled) - clear_rect.intersect(window_coordinates_to_target_coordinates(m_options.scissor_box)); + clear_rect.intersect(m_options.scissor_box); m_frame_buffer->depth_buffer()->fill(depth, clear_rect); } @@ -1143,7 +1133,7 @@ void Device::clear_stencil(StencilType value) { auto clear_rect = m_frame_buffer->rect(); if (m_options.scissor_enabled) - clear_rect.intersect(window_coordinates_to_target_coordinates(m_options.scissor_box)); + clear_rect.intersect(m_options.scissor_box); m_frame_buffer->stencil_buffer()->fill(value, clear_rect); } @@ -1156,7 +1146,7 @@ void Device::blit_to_color_buffer_at_raster_position(Gfx::Bitmap const& source) INCREASE_STATISTICS_COUNTER(g_num_pixels, source.width() * source.height()); INCREASE_STATISTICS_COUNTER(g_num_pixels_shaded, source.width() * source.height()); - auto const blit_rect = raster_rect_in_target_coordinates(source.size()); + auto const blit_rect = get_rasterization_rect_of_size({ source.width(), source.height() }); m_frame_buffer->color_buffer()->blit_from_bitmap(source, blit_rect); } @@ -1165,14 +1155,14 @@ void Device::blit_to_depth_buffer_at_raster_position(Vector<DepthType> const& de if (!m_raster_position.valid) return; - auto const raster_rect = raster_rect_in_target_coordinates({ width, height }); + auto const raster_rect = get_rasterization_rect_of_size({ width, height }); auto const y1 = raster_rect.y(); auto const y2 = y1 + height; auto const x1 = raster_rect.x(); auto const x2 = x1 + width; auto index = 0; - for (auto y = y2 - 1; y >= y1; --y) { + for (auto y = y1; y < y2; ++y) { auto depth_line = m_frame_buffer->depth_buffer()->scanline(y); for (auto x = x1; x < x2; ++x) depth_line[x] = depth_values[index++]; @@ -1181,7 +1171,7 @@ void Device::blit_to_depth_buffer_at_raster_position(Vector<DepthType> const& de void Device::blit_color_buffer_to(Gfx::Bitmap& target) { - m_frame_buffer->color_buffer()->blit_to_bitmap(target, m_frame_buffer->rect()); + m_frame_buffer->color_buffer()->blit_flipped_to_bitmap(target, m_frame_buffer->rect()); if constexpr (ENABLE_STATISTICS_OVERLAY) draw_statistics_overlay(target); @@ -1343,15 +1333,14 @@ void Device::set_raster_position(FloatVector4 const& position, FloatMatrix4x4 co m_raster_position.eye_coordinate_distance = eye_coordinates.length(); } -Gfx::IntRect Device::raster_rect_in_target_coordinates(Gfx::IntSize size) +Gfx::IntRect Device::get_rasterization_rect_of_size(Gfx::IntSize size) { - auto const raster_rect = Gfx::IntRect { + return { static_cast<int>(m_raster_position.window_coordinates.x()), static_cast<int>(m_raster_position.window_coordinates.y()), size.width(), size.height(), }; - return window_coordinates_to_target_coordinates(raster_rect); } } diff --git a/Userland/Libraries/LibSoftGPU/Device.h b/Userland/Libraries/LibSoftGPU/Device.h index f2e74b510c..ad1aa0b8c9 100644 --- a/Userland/Libraries/LibSoftGPU/Device.h +++ b/Userland/Libraries/LibSoftGPU/Device.h @@ -143,8 +143,7 @@ public: private: void draw_statistics_overlay(Gfx::Bitmap&); - Gfx::IntRect raster_rect_in_target_coordinates(Gfx::IntSize size); - Gfx::IntRect window_coordinates_to_target_coordinates(Gfx::IntRect const&); + Gfx::IntRect get_rasterization_rect_of_size(Gfx::IntSize size); void rasterize_triangle(const Triangle& triangle); void setup_blend_factors(); |