From 2ace35ed2238f5d94294e3e30c869e8725862705 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 10 May 2006 18:53:20 +0000 Subject: [PATCH] Started implementing screen-to-screen blits, not yet tested. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@17416 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../graphics/intel_extreme/intel_extreme.h | 4 ++ .../accelerants/intel_extreme/commands.h | 39 +++++++++++++++++++ .../accelerants/intel_extreme/engine.cpp | 19 +++++++++ .../accelerants/intel_extreme/hooks.cpp | 15 ++++--- .../accelerants/intel_extreme/mode.cpp | 12 ++++-- 5 files changed, 81 insertions(+), 8 deletions(-) diff --git a/headers/private/graphics/intel_extreme/intel_extreme.h b/headers/private/graphics/intel_extreme/intel_extreme.h index b9e8cb8636..c9e3fedd01 100644 --- a/headers/private/graphics/intel_extreme/intel_extreme.h +++ b/headers/private/graphics/intel_extreme/intel_extreme.h @@ -59,6 +59,7 @@ struct intel_shared_info { display_mode current_mode; uint32 bytes_per_row; + uint32 bits_per_pixel; uint32 dpms_mode; area_id registers_area; // area of memory mapped registers @@ -245,6 +246,9 @@ struct intel_free_graphics_memory { #define COMMAND_OVERLAY_OFF (2 << 21) #define OVERLAY_UPDATE_COEFFICIENTS 0x1 +// 2D acceleration +#define COMMAND_BLIT 0x54c00006 + // overlay #define INTEL_OVERLAY_UPDATE 0x30000 diff --git a/src/add-ons/accelerants/intel_extreme/commands.h b/src/add-ons/accelerants/intel_extreme/commands.h index aabdd9ecf4..f76457855e 100644 --- a/src/add-ons/accelerants/intel_extreme/commands.h +++ b/src/add-ons/accelerants/intel_extreme/commands.h @@ -39,5 +39,44 @@ class QueueCommands { // commands +struct blit_command : command { + uint8 flags; + uint8 raster_operation; + uint16 dest_bytes_per_row; + uint16 dest_left; + uint16 dest_top; + uint16 dest_right; + uint16 dest_bottom; + uint32 dest_base; + uint16 source_left; + uint16 source_top; + uint16 source_bytes_per_row; + uint16 reserved; + uint32 source_base; + + blit_command() + { + opcode = COMMAND_BLIT; + switch (gInfo->shared_info->bits_per_pixel) { + case 8: + flags = 0; + break; + case 15: + flags = 2; + break; + case 16: + flags = 1; + break; + case 32: + flags = 3; + break; + } + dest_base = source_base = gInfo->shared_info->frame_buffer_offset; + dest_bytes_per_row = source_bytes_per_row = gInfo->shared_info->bytes_per_row; + reserved = 0; + } + + virtual size_t Length() { return 6; } +}; #endif // COMMANDS_H diff --git a/src/add-ons/accelerants/intel_extreme/engine.cpp b/src/add-ons/accelerants/intel_extreme/engine.cpp index a7e5ab894e..53f09d6074 100644 --- a/src/add-ons/accelerants/intel_extreme/engine.cpp +++ b/src/add-ons/accelerants/intel_extreme/engine.cpp @@ -195,3 +195,22 @@ intel_sync_to_token(sync_token *syncToken) // #pragma mark - engine acceleration + +void +intel_screen_to_screen_blit(engine_token *token, blit_params *params, uint32 count) +{ + QueueCommands queue(gInfo->shared_info->primary_ring_buffer); + + for (uint32 i = 0; i < count; i++) { + blit_command blit; + blit.source_left = params[i].src_left; + blit.source_top = params[i].src_top; + blit.dest_left = params[i].dest_left; + blit.dest_top = params[i].dest_top; + blit.dest_right = params[i].dest_left + params[i].width; + blit.dest_bottom = params[i].dest_top + params[i].height; + + queue.Put(blit); + } +} + diff --git a/src/add-ons/accelerants/intel_extreme/hooks.cpp b/src/add-ons/accelerants/intel_extreme/hooks.cpp index 142c4bb493..5e03696af4 100644 --- a/src/add-ons/accelerants/intel_extreme/hooks.cpp +++ b/src/add-ons/accelerants/intel_extreme/hooks.cpp @@ -83,11 +83,16 @@ get_accelerant_hook(uint32 feature, void *data) return intel_sync_to_token; /* 2D acceleration */ -/* HOOK(SCREEN_TO_SCREEN_BLIT); - HOOK(FILL_RECTANGLE); - HOOK(INVERT_RECTANGLE); - HOOK(FILL_SPAN); -*/ +/* + case B_SCREEN_TO_SCREEN_BLIT: + return intel_screen_to_screen_blit; + case B_FILL_RECTANGLE: + return intel_fill_rectangle; + case B_INVERT_RECTANGLE: + return intel_invert_rectangle; + case B_FILL_SPAN: + return intel_fill_span; +*/ // overlay case B_OVERLAY_COUNT: return intel_overlay_supported_spaces; diff --git a/src/add-ons/accelerants/intel_extreme/mode.cpp b/src/add-ons/accelerants/intel_extreme/mode.cpp index b9f93da772..57ffdf01c7 100644 --- a/src/add-ons/accelerants/intel_extreme/mode.cpp +++ b/src/add-ons/accelerants/intel_extreme/mode.cpp @@ -150,7 +150,8 @@ compute_pll_divisors(const display_mode ¤t, uint32 &postDivisor, static void -get_color_space_format(const display_mode &mode, uint32 &colorMode, uint32 &bytesPerRow) +get_color_space_format(const display_mode &mode, uint32 &colorMode, + uint32 &bytesPerRow, uint32 &bitsPerPixel) { uint32 bytesPerPixel; @@ -158,19 +159,23 @@ get_color_space_format(const display_mode &mode, uint32 &colorMode, uint32 &byte case B_RGB32_LITTLE: colorMode = DISPLAY_CONTROL_RGB32; bytesPerPixel = 4; + bitsPerPixel = 32; break; case B_RGB16_LITTLE: colorMode = DISPLAY_CONTROL_RGB16; bytesPerPixel = 2; + bitsPerPixel = 16; break; case B_RGB15_LITTLE: colorMode = DISPLAY_CONTROL_RGB15; bytesPerPixel = 2; + bitsPerPixel = 15; break; case B_CMAP8: default: colorMode = DISPLAY_CONTROL_CMAP8; bytesPerPixel = 1; + bitsPerPixel = 8; break; } @@ -237,8 +242,8 @@ intel_set_display_mode(display_mode *mode) set_display_power_mode(B_DPMS_OFF); - uint32 colorMode, bytesPerRow; - get_color_space_format(current, colorMode, bytesPerRow); + uint32 colorMode, bytesPerRow, bitsPerPixel; + get_color_space_format(current, colorMode, bytesPerRow, bitsPerPixel); // free old and allocate new frame buffer in graphics memory @@ -316,6 +321,7 @@ intel_set_display_mode(display_mode *mode) // update shared info gInfo->shared_info->bytes_per_row = bytesPerRow; gInfo->shared_info->current_mode = current; + gInfo->shared_info->bits_per_pixel = bitsPerPixel; return B_OK; }