From 8c52a155f017738503f3f6b72494046dd560b6a8 Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Wed, 26 Aug 2009 10:59:28 +0000 Subject: [PATCH] Reapplied some old fixes (which don't help at all, I had already tried). Some (disabled) syslog output. Renamed buffer_info to fBufferInfo and made it private. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@32692 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/DirectWindowSupport.cpp | 82 ++++++++++++++----------- src/servers/app/DirectWindowSupport.h | 5 +- 2 files changed, 48 insertions(+), 39 deletions(-) diff --git a/src/servers/app/DirectWindowSupport.cpp b/src/servers/app/DirectWindowSupport.cpp index 91d962e475..63e59a0f5d 100644 --- a/src/servers/app/DirectWindowSupport.cpp +++ b/src/servers/app/DirectWindowSupport.cpp @@ -14,25 +14,28 @@ #include "RenderingBuffer.h" #include "clipping.h" +#include #include #include DirectWindowData::DirectWindowData() : - buffer_info(NULL), full_screen(false), + fBufferInfo(NULL), fSem(-1), fAcknowledgeSem(-1), fBufferArea(-1), - fTransition(0) + fTransition(0), + fStarted(false) { - fBufferArea = create_area("direct area", (void**)&buffer_info, + fBufferArea = create_area("direct area", (void**)&fBufferInfo, B_ANY_ADDRESS, DIRECT_BUFFER_INFO_AREA_SIZE, B_NO_LOCK, B_READ_AREA | B_WRITE_AREA); - memset(buffer_info, 0, DIRECT_BUFFER_INFO_AREA_SIZE); - buffer_info->buffer_state = B_DIRECT_STOP; + memset(fBufferInfo, 0, DIRECT_BUFFER_INFO_AREA_SIZE); + fBufferInfo->buffer_state = B_DIRECT_STOP; + fSem = create_sem(0, "direct sem"); fAcknowledgeSem = create_sem(0, "direct sem ack"); } @@ -41,8 +44,8 @@ DirectWindowData::DirectWindowData() DirectWindowData::~DirectWindowData() { // this should make the client die in case it's still running - buffer_info->bits = NULL; - buffer_info->bytes_per_row = 0; + fBufferInfo->bits = NULL; + fBufferInfo->bytes_per_row = 0; delete_area(fBufferArea); delete_sem(fSem); @@ -84,6 +87,7 @@ DirectWindowData::_SyncronizeWithClient() if (status != B_OK) return status; + //syslog(LOG_INFO, "Syncronize: released sem"); // Wait with a timeout of half a second until the client exits // from its DirectConnected() implementation do { @@ -94,6 +98,7 @@ DirectWindowData::_SyncronizeWithClient() #endif } while (status == B_INTERRUPTED); + //syslog(LOG_INFO, "Syncronize: acquired sem"); return status; } @@ -103,74 +108,77 @@ DirectWindowData::SetState(const direct_buffer_state& bufferState, const direct_driver_state& driverState, RenderingBuffer *buffer, const BRect& windowFrame, const BRegion& clipRegion) { - bool wasStopped = fTransition <= 0; + if (!fStarted && (bufferState & B_DIRECT_MODE_MASK) + != B_DIRECT_START) + return B_OK; - if ((bufferState & B_DIRECT_MODE_MASK) == B_DIRECT_STOP) - fTransition--; - else if ((bufferState & B_DIRECT_MODE_MASK) == B_DIRECT_START) - fTransition++; - - bool isStopped = fTransition <= 0; - - if (wasStopped && isStopped) { - // Nothing to change + if ((fBufferInfo->buffer_state & B_DIRECT_MODE_MASK) == B_DIRECT_STOP + && (bufferState & B_DIRECT_MODE_MASK) != B_DIRECT_START) return B_OK; - } - - buffer_info->buffer_state = bufferState; +#if 0 + if ((bufferState & B_DIRECT_MODE_MASK) == B_DIRECT_MODIFY) + syslog(LOG_INFO, "direct_modify"); +#endif + fStarted = true; +#if 0 + char string[256]; + snprintf(string, sizeof(string), "bufferState: 0x%x\n", (int)bufferState); + syslog(LOG_INFO, string); +#endif + fBufferInfo->buffer_state = bufferState; if (driverState != -1) - buffer_info->driver_state = driverState; + fBufferInfo->driver_state = driverState; if ((bufferState & B_DIRECT_MODE_MASK) != B_DIRECT_STOP) { - buffer_info->bits = buffer->Bits(); - buffer_info->pci_bits = NULL; // TODO - buffer_info->bytes_per_row = buffer->BytesPerRow(); + fBufferInfo->bits = buffer->Bits(); + fBufferInfo->pci_bits = NULL; // TODO + fBufferInfo->bytes_per_row = buffer->BytesPerRow(); switch (buffer->ColorSpace()) { case B_RGB32: case B_RGBA32: case B_RGB32_BIG: case B_RGBA32_BIG: - buffer_info->bits_per_pixel = 32; + fBufferInfo->bits_per_pixel = 32; break; case B_RGB24: case B_RGB24_BIG: - buffer_info->bits_per_pixel = 24; + fBufferInfo->bits_per_pixel = 24; break; case B_RGB16: case B_RGB16_BIG: case B_RGB15: case B_RGB15_BIG: - buffer_info->bits_per_pixel = 16; + fBufferInfo->bits_per_pixel = 16; break; case B_CMAP8: case B_GRAY8: - buffer_info->bits_per_pixel = 8; + fBufferInfo->bits_per_pixel = 8; break; default: syslog(LOG_ERR, "unknown colorspace in DirectWindowData::SetState()!\n"); - buffer_info->bits_per_pixel = 0; + fBufferInfo->bits_per_pixel = 0; break; } - buffer_info->pixel_format = buffer->ColorSpace(); - buffer_info->layout = B_BUFFER_NONINTERLEAVED; - buffer_info->orientation = B_BUFFER_TOP_TO_BOTTOM; + fBufferInfo->pixel_format = buffer->ColorSpace(); + fBufferInfo->layout = B_BUFFER_NONINTERLEAVED; + fBufferInfo->orientation = B_BUFFER_TOP_TO_BOTTOM; // TODO - buffer_info->window_bounds = to_clipping_rect(windowFrame); + fBufferInfo->window_bounds = to_clipping_rect(windowFrame); // TODO: Review this const int32 kMaxClipRectsCount = (DIRECT_BUFFER_INFO_AREA_SIZE - sizeof(direct_buffer_info)) / sizeof(clipping_rect); - buffer_info->clip_list_count = min_c(clipRegion.CountRects(), + fBufferInfo->clip_list_count = min_c(clipRegion.CountRects(), kMaxClipRectsCount); - buffer_info->clip_bounds = clipRegion.FrameInt(); + fBufferInfo->clip_bounds = clipRegion.FrameInt(); - for (uint32 i = 0; i < buffer_info->clip_list_count; i++) - buffer_info->clip_list[i] = clipRegion.RectAtInt(i); + for (uint32 i = 0; i < fBufferInfo->clip_list_count; i++) + fBufferInfo->clip_list[i] = clipRegion.RectAtInt(i); } return _SyncronizeWithClient(); diff --git a/src/servers/app/DirectWindowSupport.h b/src/servers/app/DirectWindowSupport.h index 605339a516..e39ec8aa09 100644 --- a/src/servers/app/DirectWindowSupport.h +++ b/src/servers/app/DirectWindowSupport.h @@ -50,16 +50,17 @@ public: const BRegion& clipRegion); BRect old_window_frame; - direct_buffer_info* buffer_info; bool full_screen; private: status_t _SyncronizeWithClient(); - + + direct_buffer_info* fBufferInfo; sem_id fSem; sem_id fAcknowledgeSem; area_id fBufferArea; direct_buffer_state fPreviousState; int32 fTransition; + bool fStarted; };