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
This commit is contained in:
Stefano Ceccherini
2009-08-26 10:59:28 +00:00
parent 97e88fa432
commit 8c52a155f0
2 changed files with 48 additions and 39 deletions
+45 -37
View File
@@ -14,25 +14,28 @@
#include "RenderingBuffer.h" #include "RenderingBuffer.h"
#include "clipping.h" #include "clipping.h"
#include <stdio.h>
#include <string.h> #include <string.h>
#include <syslog.h> #include <syslog.h>
DirectWindowData::DirectWindowData() DirectWindowData::DirectWindowData()
: :
buffer_info(NULL),
full_screen(false), full_screen(false),
fBufferInfo(NULL),
fSem(-1), fSem(-1),
fAcknowledgeSem(-1), fAcknowledgeSem(-1),
fBufferArea(-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_ANY_ADDRESS, DIRECT_BUFFER_INFO_AREA_SIZE,
B_NO_LOCK, B_READ_AREA | B_WRITE_AREA); B_NO_LOCK, B_READ_AREA | B_WRITE_AREA);
memset(buffer_info, 0, DIRECT_BUFFER_INFO_AREA_SIZE); memset(fBufferInfo, 0, DIRECT_BUFFER_INFO_AREA_SIZE);
buffer_info->buffer_state = B_DIRECT_STOP; fBufferInfo->buffer_state = B_DIRECT_STOP;
fSem = create_sem(0, "direct sem"); fSem = create_sem(0, "direct sem");
fAcknowledgeSem = create_sem(0, "direct sem ack"); fAcknowledgeSem = create_sem(0, "direct sem ack");
} }
@@ -41,8 +44,8 @@ DirectWindowData::DirectWindowData()
DirectWindowData::~DirectWindowData() DirectWindowData::~DirectWindowData()
{ {
// this should make the client die in case it's still running // this should make the client die in case it's still running
buffer_info->bits = NULL; fBufferInfo->bits = NULL;
buffer_info->bytes_per_row = 0; fBufferInfo->bytes_per_row = 0;
delete_area(fBufferArea); delete_area(fBufferArea);
delete_sem(fSem); delete_sem(fSem);
@@ -84,6 +87,7 @@ DirectWindowData::_SyncronizeWithClient()
if (status != B_OK) if (status != B_OK)
return status; return status;
//syslog(LOG_INFO, "Syncronize: released sem");
// Wait with a timeout of half a second until the client exits // Wait with a timeout of half a second until the client exits
// from its DirectConnected() implementation // from its DirectConnected() implementation
do { do {
@@ -94,6 +98,7 @@ DirectWindowData::_SyncronizeWithClient()
#endif #endif
} while (status == B_INTERRUPTED); } while (status == B_INTERRUPTED);
//syslog(LOG_INFO, "Syncronize: acquired sem");
return status; return status;
} }
@@ -103,74 +108,77 @@ DirectWindowData::SetState(const direct_buffer_state& bufferState,
const direct_driver_state& driverState, RenderingBuffer *buffer, const direct_driver_state& driverState, RenderingBuffer *buffer,
const BRect& windowFrame, const BRegion& clipRegion) const BRect& windowFrame, const BRegion& clipRegion)
{ {
bool wasStopped = fTransition <= 0; if (!fStarted && (bufferState & B_DIRECT_MODE_MASK)
!= B_DIRECT_START)
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
return B_OK; return B_OK;
}
buffer_info->buffer_state = bufferState; if ((fBufferInfo->buffer_state & B_DIRECT_MODE_MASK) == B_DIRECT_STOP
&& (bufferState & B_DIRECT_MODE_MASK) != B_DIRECT_START)
return B_OK;
#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) if (driverState != -1)
buffer_info->driver_state = driverState; fBufferInfo->driver_state = driverState;
if ((bufferState & B_DIRECT_MODE_MASK) != B_DIRECT_STOP) { if ((bufferState & B_DIRECT_MODE_MASK) != B_DIRECT_STOP) {
buffer_info->bits = buffer->Bits(); fBufferInfo->bits = buffer->Bits();
buffer_info->pci_bits = NULL; // TODO fBufferInfo->pci_bits = NULL; // TODO
buffer_info->bytes_per_row = buffer->BytesPerRow(); fBufferInfo->bytes_per_row = buffer->BytesPerRow();
switch (buffer->ColorSpace()) { switch (buffer->ColorSpace()) {
case B_RGB32: case B_RGB32:
case B_RGBA32: case B_RGBA32:
case B_RGB32_BIG: case B_RGB32_BIG:
case B_RGBA32_BIG: case B_RGBA32_BIG:
buffer_info->bits_per_pixel = 32; fBufferInfo->bits_per_pixel = 32;
break; break;
case B_RGB24: case B_RGB24:
case B_RGB24_BIG: case B_RGB24_BIG:
buffer_info->bits_per_pixel = 24; fBufferInfo->bits_per_pixel = 24;
break; break;
case B_RGB16: case B_RGB16:
case B_RGB16_BIG: case B_RGB16_BIG:
case B_RGB15: case B_RGB15:
case B_RGB15_BIG: case B_RGB15_BIG:
buffer_info->bits_per_pixel = 16; fBufferInfo->bits_per_pixel = 16;
break; break;
case B_CMAP8: case B_CMAP8:
case B_GRAY8: case B_GRAY8:
buffer_info->bits_per_pixel = 8; fBufferInfo->bits_per_pixel = 8;
break; break;
default: default:
syslog(LOG_ERR, syslog(LOG_ERR,
"unknown colorspace in DirectWindowData::SetState()!\n"); "unknown colorspace in DirectWindowData::SetState()!\n");
buffer_info->bits_per_pixel = 0; fBufferInfo->bits_per_pixel = 0;
break; break;
} }
buffer_info->pixel_format = buffer->ColorSpace(); fBufferInfo->pixel_format = buffer->ColorSpace();
buffer_info->layout = B_BUFFER_NONINTERLEAVED; fBufferInfo->layout = B_BUFFER_NONINTERLEAVED;
buffer_info->orientation = B_BUFFER_TOP_TO_BOTTOM; fBufferInfo->orientation = B_BUFFER_TOP_TO_BOTTOM;
// TODO // TODO
buffer_info->window_bounds = to_clipping_rect(windowFrame); fBufferInfo->window_bounds = to_clipping_rect(windowFrame);
// TODO: Review this // TODO: Review this
const int32 kMaxClipRectsCount = (DIRECT_BUFFER_INFO_AREA_SIZE const int32 kMaxClipRectsCount = (DIRECT_BUFFER_INFO_AREA_SIZE
- sizeof(direct_buffer_info)) / sizeof(clipping_rect); - 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); kMaxClipRectsCount);
buffer_info->clip_bounds = clipRegion.FrameInt(); fBufferInfo->clip_bounds = clipRegion.FrameInt();
for (uint32 i = 0; i < buffer_info->clip_list_count; i++) for (uint32 i = 0; i < fBufferInfo->clip_list_count; i++)
buffer_info->clip_list[i] = clipRegion.RectAtInt(i); fBufferInfo->clip_list[i] = clipRegion.RectAtInt(i);
} }
return _SyncronizeWithClient(); return _SyncronizeWithClient();
+2 -1
View File
@@ -50,16 +50,17 @@ public:
const BRegion& clipRegion); const BRegion& clipRegion);
BRect old_window_frame; BRect old_window_frame;
direct_buffer_info* buffer_info;
bool full_screen; bool full_screen;
private: private:
status_t _SyncronizeWithClient(); status_t _SyncronizeWithClient();
direct_buffer_info* fBufferInfo;
sem_id fSem; sem_id fSem;
sem_id fAcknowledgeSem; sem_id fAcknowledgeSem;
area_id fBufferArea; area_id fBufferArea;
direct_buffer_state fPreviousState; direct_buffer_state fPreviousState;
int32 fTransition; int32 fTransition;
bool fStarted;
}; };