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:
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user