Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2020-04-11 17:42:01 +0300
committerBrecht Van Lommel <brecht@blender.org>2020-04-11 17:42:01 +0300
commitb0350d8310f253b01b57a5a46ca982cc787b9478 (patch)
tree1889fcb6aa602ba4839d9264a1d6ab55261db7d7 /source/blender/gpu/intern/gpu_viewport.c
parenta8d139ca20024fb3b63152989968ba2fd7434eae (diff)
Revert "GPUViewport: Use GPUBatch for viewport drawing"
This reverts commit 862ec829422241878b3345661476d8551935aed2. It causes crashes on some systems, see T75584.
Diffstat (limited to 'source/blender/gpu/intern/gpu_viewport.c')
-rw-r--r--source/blender/gpu/intern/gpu_viewport.c131
1 files changed, 28 insertions, 103 deletions
diff --git a/source/blender/gpu/intern/gpu_viewport.c b/source/blender/gpu/intern/gpu_viewport.c
index fdbfa16a365..b2e1cb17946 100644
--- a/source/blender/gpu/intern/gpu_viewport.c
+++ b/source/blender/gpu/intern/gpu_viewport.c
@@ -65,24 +65,6 @@ typedef struct ViewportTempTexture {
GPUTexture *texture;
} ViewportTempTexture;
-/* Struct storing a viewport specific GPUBatch.
- * The end-goal is to have a single batch shared across viewport and use a model matrix to place
- * the batch. Due to OCIO and Image/UV editor we are not able to use an model matrix yet. */
-struct GPUViewportBatch {
- GPUBatch *batch;
- struct {
- rctf rect_pos;
- rctf rect_uv;
- } last_used_parameters;
-} GPUViewportBatch;
-
-static struct {
- GPUVertFormat format;
- struct {
- uint pos, tex_coord;
- } attr_id;
-} g_viewport = {{0}};
-
struct GPUViewport {
int size[2];
int flag;
@@ -115,7 +97,6 @@ struct GPUViewport {
/* TODO(fclem) the uvimage display use the viewport but do not set any view transform for the
* moment. The end goal would be to let the GPUViewport do the color management. */
bool do_color_management;
- struct GPUViewportBatch batch;
};
enum {
@@ -644,76 +625,6 @@ void GPU_viewport_stereo_composite(GPUViewport *viewport, Stereo3dFormat *stereo
GPU_framebuffer_restore();
}
-/* -------------------------------------------------------------------- */
-/** \name Viewport Batches
- * \{ */
-
-static GPUVertFormat *gpu_viewport_batch_format(void)
-{
- if (g_viewport.format.attr_len == 0) {
- GPUVertFormat *format = &g_viewport.format;
- g_viewport.attr_id.pos = GPU_vertformat_attr_add(
- format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
- g_viewport.attr_id.tex_coord = GPU_vertformat_attr_add(
- format, "texCoord", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
- }
- return &g_viewport.format;
-}
-
-static GPUBatch *gpu_viewport_batch_create(const rctf *rect_pos, const rctf *rect_uv)
-{
- GPUVertBuf *vbo = GPU_vertbuf_create_with_format(gpu_viewport_batch_format());
- const uint vbo_len = 4;
- GPU_vertbuf_data_alloc(vbo, vbo_len);
-
- GPUVertBufRaw pos_step, tex_coord_step;
- GPU_vertbuf_attr_get_raw_data(vbo, g_viewport.attr_id.pos, &pos_step);
- GPU_vertbuf_attr_get_raw_data(vbo, g_viewport.attr_id.tex_coord, &tex_coord_step);
-
- copy_v2_fl2(GPU_vertbuf_raw_step(&pos_step), rect_pos->xmin, rect_pos->ymin);
- copy_v2_fl2(GPU_vertbuf_raw_step(&tex_coord_step), rect_uv->xmin, rect_uv->ymin);
- copy_v2_fl2(GPU_vertbuf_raw_step(&pos_step), rect_pos->xmax, rect_pos->ymin);
- copy_v2_fl2(GPU_vertbuf_raw_step(&tex_coord_step), rect_uv->xmax, rect_uv->ymin);
- copy_v2_fl2(GPU_vertbuf_raw_step(&pos_step), rect_pos->xmin, rect_pos->ymax);
- copy_v2_fl2(GPU_vertbuf_raw_step(&tex_coord_step), rect_uv->xmin, rect_uv->ymax);
- copy_v2_fl2(GPU_vertbuf_raw_step(&pos_step), rect_pos->xmax, rect_pos->ymax);
- copy_v2_fl2(GPU_vertbuf_raw_step(&tex_coord_step), rect_uv->xmax, rect_uv->ymax);
-
- return GPU_batch_create_ex(GPU_PRIM_TRI_STRIP, vbo, NULL, GPU_BATCH_OWNS_VBO);
-}
-
-static GPUBatch *gpu_viewport_batch_get(GPUViewport *viewport,
- const rctf *rect_pos,
- const rctf *rect_uv)
-{
- const float compare_limit = 0.0001f;
- const bool parameters_changed =
- (!BLI_rctf_compare(
- &viewport->batch.last_used_parameters.rect_pos, rect_pos, compare_limit) ||
- !BLI_rctf_compare(&viewport->batch.last_used_parameters.rect_uv, rect_uv, compare_limit));
-
- if (viewport->batch.batch && parameters_changed) {
- GPU_batch_discard(viewport->batch.batch);
- viewport->batch.batch = NULL;
- }
-
- if (!viewport->batch.batch) {
- viewport->batch.batch = gpu_viewport_batch_create(rect_pos, rect_uv);
- viewport->batch.last_used_parameters.rect_pos = *rect_pos;
- viewport->batch.last_used_parameters.rect_uv = *rect_uv;
- }
- return viewport->batch.batch;
-}
-
-static void gpu_viewport_batch_free(GPUViewport *viewport)
-{
- if (viewport->batch.batch) {
- GPU_batch_discard(viewport->batch.batch);
- viewport->batch.batch = NULL;
- }
-}
-
-/** \} */
static void gpu_viewport_draw_colormanaged(GPUViewport *viewport,
const rctf *rect_pos,
@@ -724,6 +635,10 @@ static void gpu_viewport_draw_colormanaged(GPUViewport *viewport,
GPUTexture *color = dtxl->color;
GPUTexture *color_overlay = dtxl->color_overlay;
+ GPUVertFormat *vert_format = immVertexFormat();
+ uint pos = GPU_vertformat_attr_add(vert_format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+ uint texco = GPU_vertformat_attr_add(vert_format, "texCoord", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+
bool use_ocio = false;
if (viewport->do_color_management && display_colorspace) {
@@ -735,26 +650,38 @@ static void gpu_viewport_draw_colormanaged(GPUViewport *viewport,
true);
}
- GPUBatch *batch = gpu_viewport_batch_get(viewport, rect_pos, rect_uv);
- if (use_ocio) {
- GPU_batch_program_set_imm_shader(batch);
- }
- else {
- GPU_batch_program_set_builtin(batch, GPU_SHADER_2D_IMAGE_OVERLAYS_MERGE);
- GPU_batch_uniform_1i(batch, "display_transform", display_colorspace);
- GPU_batch_uniform_1i(batch, "image_texture", 0);
- GPU_batch_uniform_1i(batch, "overlays_texture", 1);
+ if (!use_ocio) {
+ immBindBuiltinProgram(GPU_SHADER_2D_IMAGE_OVERLAYS_MERGE);
+ immUniform1i("display_transform", display_colorspace);
+ immUniform1i("image_texture", 0);
+ immUniform1i("overlays_texture", 1);
}
GPU_texture_bind(color, 0);
GPU_texture_bind(color_overlay, 1);
- GPU_batch_draw(batch);
+
+ immBegin(GPU_PRIM_TRI_STRIP, 4);
+
+ immAttr2f(texco, rect_uv->xmin, rect_uv->ymin);
+ immVertex2f(pos, rect_pos->xmin, rect_pos->ymin);
+ immAttr2f(texco, rect_uv->xmax, rect_uv->ymin);
+ immVertex2f(pos, rect_pos->xmax, rect_pos->ymin);
+ immAttr2f(texco, rect_uv->xmin, rect_uv->ymax);
+ immVertex2f(pos, rect_pos->xmin, rect_pos->ymax);
+ immAttr2f(texco, rect_uv->xmax, rect_uv->ymax);
+ immVertex2f(pos, rect_pos->xmax, rect_pos->ymax);
+
+ immEnd();
+
GPU_texture_unbind(color);
GPU_texture_unbind(color_overlay);
if (use_ocio) {
IMB_colormanagement_finish_glsl_draw();
}
+ else {
+ immUnbindProgram();
+ }
}
/**
@@ -818,8 +745,8 @@ void GPU_viewport_draw_to_screen_ex(GPUViewport *viewport,
* Merge and draw the buffers of \a viewport into the currently active framebuffer, performing
* color transform to display space.
*
- * \param rect: Coordinates to draw into. By swapping min and max values, drawing can be done
- * with inversed axis coordinates (upside down or sideways).
+ * \param rect: Coordinates to draw into. By swapping min and max values, drawing can be done with
+ * inversed axis coordinates (upside down or sideways).
*/
void GPU_viewport_draw_to_screen(GPUViewport *viewport, int view, const rcti *rect)
{
@@ -996,7 +923,5 @@ void GPU_viewport_free(GPUViewport *viewport)
DRW_instance_data_list_free(viewport->idatalist);
MEM_freeN(viewport->idatalist);
- gpu_viewport_batch_free(viewport);
-
MEM_freeN(viewport);
}