mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 16:08:04 +02:00
radeon: Implement EGL_MESA_no_surface_extension
This commit is contained in:
parent
a457ca7844
commit
f9b5201dbd
2 changed files with 53 additions and 35 deletions
|
|
@ -171,6 +171,10 @@ void radeonSetCliprects(radeonContextPtr radeon)
|
|||
{
|
||||
__DRIdrawable *const drawable = radeon_get_drawable(radeon);
|
||||
__DRIdrawable *const readable = radeon_get_readable(radeon);
|
||||
|
||||
if(drawable == NULL && readable == NULL)
|
||||
return;
|
||||
|
||||
struct radeon_framebuffer *const draw_rfb = drawable->driverPrivate;
|
||||
struct radeon_framebuffer *const read_rfb = readable->driverPrivate;
|
||||
int x_off, y_off;
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#include "drirenderbuffer.h"
|
||||
#include "drivers/common/meta.h"
|
||||
#include "main/context.h"
|
||||
#include "main/framebuffer.h"
|
||||
#include "main/renderbuffer.h"
|
||||
#include "main/state.h"
|
||||
#include "main/simple_list.h"
|
||||
|
|
@ -379,12 +380,12 @@ GLboolean radeonUnbindContext(__DRIcontext * driContextPriv)
|
|||
|
||||
static void
|
||||
radeon_make_kernel_renderbuffer_current(radeonContextPtr radeon,
|
||||
struct radeon_framebuffer *draw)
|
||||
struct gl_framebuffer *draw)
|
||||
{
|
||||
/* if radeon->fake */
|
||||
struct radeon_renderbuffer *rb;
|
||||
|
||||
if ((rb = (void *)draw->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
|
||||
if ((rb = (void *)draw->Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
|
||||
if (!rb->bo) {
|
||||
rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
|
||||
radeon->radeonScreen->frontOffset,
|
||||
|
|
@ -396,7 +397,7 @@ radeon_make_kernel_renderbuffer_current(radeonContextPtr radeon,
|
|||
rb->cpp = radeon->radeonScreen->cpp;
|
||||
rb->pitch = radeon->radeonScreen->frontPitch * rb->cpp;
|
||||
}
|
||||
if ((rb = (void *)draw->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
|
||||
if ((rb = (void *)draw->Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
|
||||
if (!rb->bo) {
|
||||
rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
|
||||
radeon->radeonScreen->backOffset,
|
||||
|
|
@ -408,7 +409,7 @@ radeon_make_kernel_renderbuffer_current(radeonContextPtr radeon,
|
|||
rb->cpp = radeon->radeonScreen->cpp;
|
||||
rb->pitch = radeon->radeonScreen->backPitch * rb->cpp;
|
||||
}
|
||||
if ((rb = (void *)draw->base.Attachment[BUFFER_DEPTH].Renderbuffer)) {
|
||||
if ((rb = (void *)draw->Attachment[BUFFER_DEPTH].Renderbuffer)) {
|
||||
if (!rb->bo) {
|
||||
rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
|
||||
radeon->radeonScreen->depthOffset,
|
||||
|
|
@ -420,7 +421,7 @@ radeon_make_kernel_renderbuffer_current(radeonContextPtr radeon,
|
|||
rb->cpp = radeon->radeonScreen->cpp;
|
||||
rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
|
||||
}
|
||||
if ((rb = (void *)draw->base.Attachment[BUFFER_STENCIL].Renderbuffer)) {
|
||||
if ((rb = (void *)draw->Attachment[BUFFER_STENCIL].Renderbuffer)) {
|
||||
if (!rb->bo) {
|
||||
rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
|
||||
radeon->radeonScreen->depthOffset,
|
||||
|
|
@ -436,7 +437,7 @@ radeon_make_kernel_renderbuffer_current(radeonContextPtr radeon,
|
|||
|
||||
static void
|
||||
radeon_make_renderbuffer_current(radeonContextPtr radeon,
|
||||
struct radeon_framebuffer *draw)
|
||||
struct gl_framebuffer *draw)
|
||||
{
|
||||
int size = 4096*4096*4;
|
||||
/* if radeon->fake */
|
||||
|
|
@ -448,7 +449,7 @@ radeon_make_renderbuffer_current(radeonContextPtr radeon,
|
|||
}
|
||||
|
||||
|
||||
if ((rb = (void *)draw->base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
|
||||
if ((rb = (void *)draw->Attachment[BUFFER_FRONT_LEFT].Renderbuffer)) {
|
||||
if (!rb->bo) {
|
||||
rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
|
||||
radeon->radeonScreen->frontOffset +
|
||||
|
|
@ -461,7 +462,7 @@ radeon_make_renderbuffer_current(radeonContextPtr radeon,
|
|||
rb->cpp = radeon->radeonScreen->cpp;
|
||||
rb->pitch = radeon->radeonScreen->frontPitch * rb->cpp;
|
||||
}
|
||||
if ((rb = (void *)draw->base.Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
|
||||
if ((rb = (void *)draw->Attachment[BUFFER_BACK_LEFT].Renderbuffer)) {
|
||||
if (!rb->bo) {
|
||||
rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
|
||||
radeon->radeonScreen->backOffset +
|
||||
|
|
@ -474,7 +475,7 @@ radeon_make_renderbuffer_current(radeonContextPtr radeon,
|
|||
rb->cpp = radeon->radeonScreen->cpp;
|
||||
rb->pitch = radeon->radeonScreen->backPitch * rb->cpp;
|
||||
}
|
||||
if ((rb = (void *)draw->base.Attachment[BUFFER_DEPTH].Renderbuffer)) {
|
||||
if ((rb = (void *)draw->Attachment[BUFFER_DEPTH].Renderbuffer)) {
|
||||
if (!rb->bo) {
|
||||
rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
|
||||
radeon->radeonScreen->depthOffset +
|
||||
|
|
@ -487,7 +488,7 @@ radeon_make_renderbuffer_current(radeonContextPtr radeon,
|
|||
rb->cpp = radeon->radeonScreen->cpp;
|
||||
rb->pitch = radeon->radeonScreen->depthPitch * rb->cpp;
|
||||
}
|
||||
if ((rb = (void *)draw->base.Attachment[BUFFER_STENCIL].Renderbuffer)) {
|
||||
if ((rb = (void *)draw->Attachment[BUFFER_STENCIL].Renderbuffer)) {
|
||||
if (!rb->bo) {
|
||||
rb->bo = radeon_bo_open(radeon->radeonScreen->bom,
|
||||
radeon->radeonScreen->depthOffset +
|
||||
|
|
@ -793,8 +794,8 @@ GLboolean radeonMakeCurrent(__DRIcontext * driContextPriv,
|
|||
__DRIdrawable * driReadPriv)
|
||||
{
|
||||
radeonContextPtr radeon;
|
||||
struct radeon_framebuffer *drfb;
|
||||
struct gl_framebuffer *readfb;
|
||||
struct radeon_framebuffer *rdrfb;
|
||||
struct gl_framebuffer *drfb, *readfb;
|
||||
|
||||
if (!driContextPriv) {
|
||||
if (RADEON_DEBUG & RADEON_DRI)
|
||||
|
|
@ -804,17 +805,25 @@ GLboolean radeonMakeCurrent(__DRIcontext * driContextPriv,
|
|||
}
|
||||
|
||||
radeon = (radeonContextPtr) driContextPriv->driverPrivate;
|
||||
drfb = driDrawPriv->driverPrivate;
|
||||
readfb = driReadPriv->driverPrivate;
|
||||
|
||||
if(driDrawPriv == NULL && driReadPriv == NULL) {
|
||||
drfb = _mesa_create_framebuffer(&radeon->glCtx->Visual);
|
||||
readfb = drfb;
|
||||
}
|
||||
else {
|
||||
drfb = driDrawPriv->driverPrivate;
|
||||
readfb = driReadPriv->driverPrivate;
|
||||
}
|
||||
|
||||
if (driContextPriv->driScreenPriv->dri2.enabled) {
|
||||
radeon_update_renderbuffers(driContextPriv, driDrawPriv, GL_FALSE);
|
||||
if(driDrawPriv)
|
||||
radeon_update_renderbuffers(driContextPriv, driDrawPriv, GL_FALSE);
|
||||
if (driDrawPriv != driReadPriv)
|
||||
radeon_update_renderbuffers(driContextPriv, driReadPriv, GL_FALSE);
|
||||
_mesa_reference_renderbuffer(&radeon->state.color.rb,
|
||||
&(radeon_get_renderbuffer(&drfb->base, BUFFER_BACK_LEFT)->base));
|
||||
&(radeon_get_renderbuffer(drfb, BUFFER_BACK_LEFT)->base));
|
||||
_mesa_reference_renderbuffer(&radeon->state.depth.rb,
|
||||
&(radeon_get_renderbuffer(&drfb->base, BUFFER_DEPTH)->base));
|
||||
&(radeon_get_renderbuffer(drfb, BUFFER_DEPTH)->base));
|
||||
} else {
|
||||
radeon_make_renderbuffer_current(radeon, drfb);
|
||||
}
|
||||
|
|
@ -822,35 +831,40 @@ GLboolean radeonMakeCurrent(__DRIcontext * driContextPriv,
|
|||
if (RADEON_DEBUG & RADEON_DRI)
|
||||
fprintf(stderr, "%s ctx %p dfb %p rfb %p\n", __FUNCTION__, radeon->glCtx, drfb, readfb);
|
||||
|
||||
driUpdateFramebufferSize(radeon->glCtx, driDrawPriv);
|
||||
if(driDrawPriv)
|
||||
driUpdateFramebufferSize(radeon->glCtx, driDrawPriv);
|
||||
if (driReadPriv != driDrawPriv)
|
||||
driUpdateFramebufferSize(radeon->glCtx, driReadPriv);
|
||||
|
||||
_mesa_make_current(radeon->glCtx, &drfb->base, readfb);
|
||||
_mesa_make_current(radeon->glCtx, drfb, readfb);
|
||||
if (driDrawPriv == NULL && driReadPriv == NULL)
|
||||
_mesa_reference_framebuffer(&drfb, NULL);
|
||||
|
||||
_mesa_update_state(radeon->glCtx);
|
||||
|
||||
if (radeon->glCtx->DrawBuffer == &drfb->base) {
|
||||
if (driDrawPriv->swap_interval == (unsigned)-1) {
|
||||
int i;
|
||||
driDrawPriv->vblFlags =
|
||||
(radeon->radeonScreen->irq != 0)
|
||||
? driGetDefaultVBlankFlags(&radeon->
|
||||
optionCache)
|
||||
: VBLANK_FLAG_NO_IRQ;
|
||||
if (radeon->glCtx->DrawBuffer == drfb) {
|
||||
if(driDrawPriv != NULL) {
|
||||
rdrfb = (struct radeon_framebuffer *)drfb;
|
||||
if (driDrawPriv->swap_interval == (unsigned)-1) {
|
||||
int i;
|
||||
driDrawPriv->vblFlags =
|
||||
(radeon->radeonScreen->irq != 0)
|
||||
? driGetDefaultVBlankFlags(&radeon->
|
||||
optionCache)
|
||||
: VBLANK_FLAG_NO_IRQ;
|
||||
|
||||
driDrawableInitVBlank(driDrawPriv);
|
||||
drfb->vbl_waited = driDrawPriv->vblSeq;
|
||||
driDrawableInitVBlank(driDrawPriv);
|
||||
rdrfb->vbl_waited = driDrawPriv->vblSeq;
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
if (drfb->color_rb[i])
|
||||
drfb->color_rb[i]->vbl_pending = driDrawPriv->vblSeq;
|
||||
for (i = 0; i < 2; i++) {
|
||||
if (rdrfb->color_rb[i])
|
||||
rdrfb->color_rb[i]->vbl_pending = driDrawPriv->vblSeq;
|
||||
}
|
||||
}
|
||||
|
||||
radeon_window_moved(radeon);
|
||||
}
|
||||
|
||||
radeon_window_moved(radeon);
|
||||
radeon_draw_buffer(radeon->glCtx, &drfb->base);
|
||||
radeon_draw_buffer(radeon->glCtx, drfb);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue