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:
parent
97e88fa432
commit
8c52a155f0
@ -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();
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user