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

View File

@ -14,25 +14,28 @@
#include "RenderingBuffer.h"
#include "clipping.h"
#include <stdio.h>
#include <string.h>
#include <syslog.h>
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();

View File

@ -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;
};