2 #include "framebuffer.h"
3 #include "renderbuffer.h"
6 #include "nouveau_context.h"
7 #include "nouveau_fbo.h"
8 #include "nouveau_fifo.h"
9 #include "nouveau_msg.h"
10 #include "nouveau_object.h"
11 #include "nouveau_reg.h"
14 nouveau_renderbuffer_pixelformat(nouveau_renderbuffer_t
* nrb
,
15 GLenum internalFormat
)
17 nrb
->mesa
.InternalFormat
= internalFormat
;
19 /*TODO: We probably want to extend this a bit, and maybe make
22 switch (internalFormat
) {
25 nrb
->mesa
._BaseFormat
= GL_RGBA
;
26 nrb
->mesa
._ActualFormat
= GL_RGBA8
;
27 nrb
->mesa
.DataType
= GL_UNSIGNED_BYTE
;
28 nrb
->mesa
.RedBits
= 8;
29 nrb
->mesa
.GreenBits
= 8;
30 nrb
->mesa
.BlueBits
= 8;
31 nrb
->mesa
.AlphaBits
= 8;
36 nrb
->mesa
._BaseFormat
= GL_RGB
;
37 nrb
->mesa
._ActualFormat
= GL_RGB5
;
38 nrb
->mesa
.DataType
= GL_UNSIGNED_BYTE
;
39 nrb
->mesa
.RedBits
= 5;
40 nrb
->mesa
.GreenBits
= 6;
41 nrb
->mesa
.BlueBits
= 5;
42 nrb
->mesa
.AlphaBits
= 0;
45 case GL_DEPTH_COMPONENT16
:
46 nrb
->mesa
._BaseFormat
= GL_DEPTH_COMPONENT
;
47 nrb
->mesa
._ActualFormat
= GL_DEPTH_COMPONENT16
;
48 nrb
->mesa
.DataType
= GL_UNSIGNED_SHORT
;
49 nrb
->mesa
.DepthBits
= 16;
52 case GL_DEPTH_COMPONENT24
:
53 nrb
->mesa
._BaseFormat
= GL_DEPTH_COMPONENT
;
54 nrb
->mesa
._ActualFormat
= GL_DEPTH24_STENCIL8_EXT
;
55 nrb
->mesa
.DataType
= GL_UNSIGNED_INT_24_8_EXT
;
56 nrb
->mesa
.DepthBits
= 24;
59 case GL_STENCIL_INDEX8_EXT
:
60 nrb
->mesa
._BaseFormat
= GL_STENCIL_INDEX
;
61 nrb
->mesa
._ActualFormat
= GL_DEPTH24_STENCIL8_EXT
;
62 nrb
->mesa
.DataType
= GL_UNSIGNED_INT_24_8_EXT
;
63 nrb
->mesa
.StencilBits
= 8;
66 case GL_DEPTH24_STENCIL8_EXT
:
67 nrb
->mesa
._BaseFormat
= GL_DEPTH_STENCIL_EXT
;
68 nrb
->mesa
._ActualFormat
= GL_DEPTH24_STENCIL8_EXT
;
69 nrb
->mesa
.DataType
= GL_UNSIGNED_INT_24_8_EXT
;
70 nrb
->mesa
.DepthBits
= 24;
71 nrb
->mesa
.StencilBits
= 8;
83 nouveau_renderbuffer_storage(GLcontext
* ctx
, struct gl_renderbuffer
*rb
,
84 GLenum internalFormat
,
85 GLuint width
, GLuint height
)
87 nouveau_renderbuffer_t
*nrb
= (nouveau_renderbuffer_t
*) rb
;
89 if (!nouveau_renderbuffer_pixelformat(nrb
, internalFormat
)) {
90 fprintf(stderr
, "%s: unknown internalFormat\n", __func__
);
94 /* If this buffer isn't statically alloc'd, we may need to ask the
95 * drm for more memory */
96 if (rb
->Width
!= width
|| rb
->Height
!= height
) {
99 /* align pitches to 64 bytes */
100 pitch
= ((width
* nrb
->cpp
) + 63) & ~63;
103 nouveau_mem_free(ctx
, nrb
->mem
);
104 nrb
->mem
= nouveau_mem_alloc(ctx
,
111 /* update nouveau_renderbuffer info */
112 nrb
->offset
= nouveau_mem_gpu_offset_get(ctx
, nrb
->mem
);
118 rb
->InternalFormat
= internalFormat
;
120 nouveauSpanSetFunctions(nrb
);
126 nouveau_renderbuffer_delete(struct gl_renderbuffer
*rb
)
128 GET_CURRENT_CONTEXT(ctx
);
129 nouveau_renderbuffer_t
*nrb
= (nouveau_renderbuffer_t
*) rb
;
132 nouveau_mem_free(ctx
, nrb
->mem
);
136 nouveau_renderbuffer_t
*
137 nouveau_renderbuffer_new(GLenum internalFormat
)
139 nouveau_renderbuffer_t
*nrb
;
141 nrb
= CALLOC_STRUCT(nouveau_renderbuffer
);
145 _mesa_init_renderbuffer(&nrb
->mesa
, 0);
147 if (!nouveau_renderbuffer_pixelformat(nrb
, internalFormat
)) {
148 fprintf(stderr
, "%s: unknown internalFormat\n", __func__
);
152 nrb
->mesa
.AllocStorage
= nouveau_renderbuffer_storage
;
153 nrb
->mesa
.Delete
= nouveau_renderbuffer_delete
;
159 nouveau_cliprects_renderbuffer_set(nouveauContextPtr nmesa
,
160 nouveau_renderbuffer_t
* nrb
)
162 nmesa
->numClipRects
= 1;
163 nmesa
->pClipRects
= &nmesa
->osClipRect
;
164 nmesa
->osClipRect
.x1
= 0;
165 nmesa
->osClipRect
.y1
= 0;
166 nmesa
->osClipRect
.x2
= nrb
->mesa
.Width
;
167 nmesa
->osClipRect
.y2
= nrb
->mesa
.Height
;
170 nmesa
->drawW
= nrb
->mesa
.Width
;
171 nmesa
->drawH
= nrb
->mesa
.Height
;
175 nouveau_window_moved(GLcontext
* ctx
)
177 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
178 nouveau_renderbuffer_t
*nrb
;
180 nrb
= (nouveau_renderbuffer_t
*) ctx
->DrawBuffer
->_ColorDrawBuffers
[0];
184 nouveau_cliprects_renderbuffer_set(nmesa
, nrb
);
186 /* Viewport depends on window size/position, nouveauCalcViewport
187 * will take care of calling the hw-specific WindowMoved
189 ctx
->Driver
.Viewport(ctx
, ctx
->Viewport
.X
, ctx
->Viewport
.Y
,
190 ctx
->Viewport
.Width
, ctx
->Viewport
.Height
);
191 /* Scissor depends on window position */
192 ctx
->Driver
.Scissor(ctx
, ctx
->Scissor
.X
, ctx
->Scissor
.Y
,
193 ctx
->Scissor
.Width
, ctx
->Scissor
.Height
);
197 nouveau_build_framebuffer(GLcontext
*ctx
, struct gl_framebuffer
*fb
)
199 nouveauContextPtr nmesa
= NOUVEAU_CONTEXT(ctx
);
200 nouveau_renderbuffer_t
*color
[MAX_DRAW_BUFFERS
];
201 nouveau_renderbuffer_t
*depth
;
203 _mesa_update_framebuffer(ctx
);
204 _mesa_update_draw_buffer_bounds(ctx
);
206 color
[0] = (nouveau_renderbuffer_t
*) fb
->_ColorDrawBuffers
[0];
207 if (fb
->_DepthBuffer
&& fb
->_DepthBuffer
->Wrapped
)
208 depth
= (nouveau_renderbuffer_t
*) fb
->_DepthBuffer
->Wrapped
;
210 depth
= (nouveau_renderbuffer_t
*) fb
->_DepthBuffer
;
212 if (!nmesa
->hw_func
.BindBuffers(nmesa
, 1, color
, depth
))
214 nouveau_window_moved(ctx
);
220 nouveauDrawBuffer(GLcontext
*ctx
, GLenum buffer
)
222 nouveau_build_framebuffer(ctx
, ctx
->DrawBuffer
);
225 static struct gl_framebuffer
*
226 nouveauNewFramebuffer(GLcontext
*ctx
, GLuint name
)
228 return _mesa_new_framebuffer(ctx
, name
);
231 static struct gl_renderbuffer
*
232 nouveauNewRenderbuffer(GLcontext
*ctx
, GLuint name
)
234 nouveau_renderbuffer_t
*nrb
;
236 nrb
= CALLOC_STRUCT(nouveau_renderbuffer
);
240 _mesa_init_renderbuffer(&nrb
->mesa
, name
);
242 nrb
->mesa
.AllocStorage
= nouveau_renderbuffer_storage
;
243 nrb
->mesa
.Delete
= nouveau_renderbuffer_delete
;
248 nouveauBindFramebuffer(GLcontext
*ctx
, GLenum target
,
249 struct gl_framebuffer
*fb
,
250 struct gl_framebuffer
*fbread
)
252 if (target
== GL_FRAMEBUFFER_EXT
|| target
== GL_DRAW_FRAMEBUFFER_EXT
) {
253 nouveau_build_framebuffer(ctx
, fb
);
258 nouveauFramebufferRenderbuffer(GLcontext
*ctx
, struct gl_framebuffer
*fb
,
259 GLenum attachment
, struct gl_renderbuffer
*rb
)
261 _mesa_framebuffer_renderbuffer(ctx
, fb
, attachment
, rb
);
262 nouveau_build_framebuffer(ctx
, fb
);
266 nouveauRenderTexture(GLcontext
* ctx
, struct gl_framebuffer
*fb
,
267 struct gl_renderbuffer_attachment
*att
)
272 nouveauFinishRenderTexture(GLcontext
* ctx
,
273 struct gl_renderbuffer_attachment
*att
)
278 nouveauInitBufferFuncs(struct dd_function_table
*func
)
280 func
->DrawBuffer
= nouveauDrawBuffer
;
282 func
->NewFramebuffer
= nouveauNewFramebuffer
;
283 func
->NewRenderbuffer
= nouveauNewRenderbuffer
;
284 func
->BindFramebuffer
= nouveauBindFramebuffer
;
285 func
->FramebufferRenderbuffer
= nouveauFramebufferRenderbuffer
;
286 func
->RenderTexture
= nouveauRenderTexture
;
287 func
->FinishRenderTexture
= nouveauFinishRenderTexture
;